Estou criando um aplicativo para Android em que preciso iniciar uma atividade em segundo plano. Estou usando um ForegroundStarter que estende o Serviço para fazer isso. Tenho uma atividade Adscreen.class que preciso executar no meu serviço de primeiro plano. A atividade Adscreen.class funciona bem (começa em segundo plano) em todas as versões do Android, exceto o 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);
}
}
Eu li que existem algumas restrições no início de atividades em segundo plano no Android 10. Esse código não parece mais funcionar. 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);
Alguma solução alternativa para iniciar uma atividade em segundo plano no Android 10?
android
foreground-service
SK707
fonte
fonte
Respostas:
Não tenho certeza se é certo fazê-lo dessa maneira, mas não tive tempo suficiente (o aplicativo é apenas para uso interno da empresa).
Eu usei permissões:
e todos os usuários precisam ir para a configuração -> permissões do aplicativo e, em seguida, marcar a caixa de seleção nas configurações avançadas da função "mostrar o aplicativo sobre os outros"
Desculpem o meu inglês ou não exatamente a solução certa, mas funcionou, um bom hotfix para mim.
No Pixel 4, será assim:
fonte
Como você mencionou Restrições ao iniciar atividades em segundo plano
É afirmado que
Eles também mencionaram em sua nota é isso.
Isso significa que, se você estiver usando um serviço em primeiro plano para iniciar uma atividade, ele ainda considera o aplicativo em segundo plano e não inicia uma atividade do aplicativo.
Solução: em primeiro lugar, não é possível iniciar o aplicativo se ele estiver sendo executado em segundo plano no Android 10 (nível 29 da API) e superior. Eles forneceram uma nova maneira de superar esse comportamento: em vez de chamar o aplicativo, você pode mostrar uma notificação de alta prioridade com a intenção de tela cheia .
A intenção de tela cheia se comporta como se a tela do dispositivo estivesse desligada. Ele iniciará a atividade do aplicativo que você deseja. mas se o seu aplicativo estiver em segundo plano e a tela estiver ativada, mostrará apenas uma notificação. Se você clicar na notificação, ela abrirá seu aplicativo.
Para obter mais informações sobre a notificação de alta prioridade e a intenção de tela cheia, verifique aqui Exibir notificações sensíveis ao tempo
fonte
Você deve incluir no AndroidManifest.xml abaixo da permissão.
fonte