Ich baue eine Android-App, in der ich eine Aktivität aus dem Hintergrund starten muss. Ich verwende einen ForegroundStarter, der den Service erweitert, um dies zu erreichen. Ich habe eine Aktivität Adscreen.class, die ich von meinem Vordergrunddienst ausführen muss. Die Aktivität Adscreen.class funktioniert auf allen Android-Versionen außer Android 10 einwandfrei (ausgehend vom Hintergrund).
ForeGroundStarter.class
public class ForeGroundStarter extends Service {
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
Log.d("sK", "Inside Foreground");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d("sK", "Inside Foreground onStartCommand");
Intent notificationIntent = new Intent(this, Adscreen.class);
PendingIntent pendingIntent =
PendingIntent.getActivity(this, 0, notificationIntent, 0);
Notification notification =
null;
//Launching Foreground Services From API 26+
notificationIntent = new Intent(this, Adscreen.class);
pendingIntent =
PendingIntent.getActivity(this, 0, notificationIntent, 0);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
String NOTIFICATION_CHANNEL_ID = "com.currency.usdtoinr";
String channelName = "My Background Service";
NotificationChannel chan = null;
chan = new NotificationChannel(NOTIFICATION_CHANNEL_ID, channelName, NotificationManager.IMPORTANCE_NONE);
chan.setLightColor(Color.BLUE);
chan.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE);
NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
assert manager != null;
manager.createNotificationChannel(chan);
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this, NOTIFICATION_CHANNEL_ID);
notification = notificationBuilder.setOngoing(true)
.setSmallIcon(R.drawable.nicon)
.setContentTitle("")
.setPriority(NotificationManager.IMPORTANCE_MIN)
.setCategory(Notification.CATEGORY_SERVICE)
.build();
startForeground(2, notification);
Intent dialogIntent = new Intent(this, Adscreen.class);
dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(dialogIntent);
Log.d("sk", "After startforeground executed");
}
else //API 26 and lower
{
notificationIntent = new Intent(this, Adscreen.class);
pendingIntent =
PendingIntent.getActivity(this, 0, notificationIntent, 0);
notification =
new Notification.Builder(this)
.setContentTitle("")
.setContentText("")
.setSmallIcon(R.drawable.nicon)
.setContentIntent(pendingIntent)
.setTicker("")
.build();
startForeground(2, notification);
Intent dialogIntent = new Intent(this, Adscreen.class);
dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(dialogIntent);
}
return super.onStartCommand(intent, flags, startId);
}
}
Ich habe gelesen, dass es einige Einschränkungen beim Starten von Aktivitäten aus dem Hintergrund unter Android 10 gibt. Dieser Code scheint nicht mehr zu funktionieren. https://developer.android.com/guide/components/activities/background-starts
Intent dialogIntent = new Intent(this, Adscreen.class);
dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(dialogIntent);
Gibt es Problemumgehungen, um eine Aktivität unter Android 10 im Hintergrund zu starten?
quelle
Antworten:
Ich bin mir nicht sicher, ob es richtig ist, es auf diese Weise zu tun, aber ich hatte nicht genug Zeit (App ist nur für den unternehmensinternen Gebrauch).
Ich habe Berechtigungen verwendet:
und dann muss jeder Benutzer zu Einstellung -> Berechtigungen der App gehen und dann in den erweiterten Einstellungen das Kontrollkästchen für die Funktion "App über andere anzeigen" aktivieren.
Entschuldigung für mein Englisch oder nicht genau die richtige Lösung, aber es hat funktioniert, also guter Hotfix für mich.
Auf Pixel 4 sieht es so aus:
quelle
Wie Sie bereits erwähnt haben Einschränkungen beim Starten von Aktivitäten im Hintergrund
Es wird angegeben, daß
Sie erwähnten auch in ihrer Notiz, dass.
Wenn Sie also einen Vordergrunddienst zum Starten einer Aktivität verwenden, wird weiterhin berücksichtigt, dass sich die App im Hintergrund befindet und keine App-Aktivität gestartet wird.
Lösung: Erstens können Sie die App nicht starten, wenn sie im Hintergrund von Android 10 (API-Stufe 29) und höher ausgeführt wird. Sie haben eine neue Möglichkeit bereitgestellt, um dieses Verhalten zu überwinden: Anstatt die App aufzurufen, können Sie eine Benachrichtigung mit hoher Priorität mit einem anzeigen Vollbildabsicht anzeigen .
Die Vollbild-Absicht verhält sich so, als ob der Bildschirm Ihres Geräts ausgeschaltet ist. Dadurch wird die gewünschte App-Aktivität gestartet. Wenn sich Ihre App jedoch im Hintergrund befindet und der Bildschirm eingeschaltet ist, wird nur eine Benachrichtigung angezeigt. Wenn Sie auf die Benachrichtigung klicken, wird Ihre App geöffnet.
Weitere Informationen zu Benachrichtigungen mit hoher Priorität und Vollbild-Absichten finden Sie hier. Zeitkritische Benachrichtigungen anzeigen
quelle
Sie sollten AndroidManifest.xml unter der Berechtigung einfügen.
quelle