Je crée une application Android sur laquelle je dois démarrer une activité en arrière-plan. J'utilise un ForegroundStarter qui étend le service pour y parvenir. J'ai une activité Adscreen.class que je dois exécuter à partir de mon service Foreground. L'activité Adscreen.class fonctionne bien (commence à partir de l'arrière-plan) sur toutes les versions d'Android sauf Android 10.
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);
}
}
J'ai lu qu'il y avait des restrictions sur le démarrage d'activités à partir de l'arrière-plan sur Android 10. Ce code ne semble plus fonctionner. 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);
Des solutions de contournement pour démarrer une activité depuis l'arrière-plan sur Android 10?
Réponses:
Je ne sais pas si c'est bien de le faire de cette façon, mais je n'ai pas eu assez de temps (l'application est réservée à l'usage interne de l'entreprise).
J'ai utilisé des autorisations:
puis chaque utilisateur doit aller dans le paramètre -> autorisations de l'application, puis cochez la case dans les paramètres avancés pour la fonction "afficher l'application sur les autres"
Désolé pour mon anglais ou pas exactement la bonne solution, mais cela a fonctionné, donc bon correctif pour moi.
Sur Pixel 4, cela ressemblera à ceci:
la source
Comme vous l'avez mentionné Restrictions concernant le démarrage d'activités à l'arrière-plan
Il est indiqué que
Ils ont également mentionné dans leur note que.
Cela signifie que si vous utilisez un service de premier plan pour démarrer une activité, il considère toujours que l'application est en arrière-plan et ne lancera pas d'activité d'application.
Solution: Tout d'abord, vous ne pouvez pas démarrer l'application si elle s'exécute en arrière-plan depuis Android 10 (niveau 29 de l'API) et plus. Ils ont fourni une nouvelle façon de surmonter ce comportement qui est qu'au lieu d'appeler l'application, vous pouvez afficher une notification de haute priorité avec une intention plein écran .
L'intention plein écran se comporte comme si l'écran de votre appareil était éteint. Cela lancera l'activité de l'application que vous souhaitez. mais si votre application est en arrière-plan et que l'écran est allumé, elle affichera simplement une notification. Si vous cliquez sur la notification, cela ouvrira votre application.
Pour plus d'informations sur les notifications haute priorité et l'intention en plein écran, vous pouvez les vérifier ici Afficher les notifications sensibles au facteur temps
la source
Vous devez inclure dans AndroidManifest.xml ci-dessous l'autorisation.
la source