Como iniciar uma atividade em segundo plano no Android 10?

12

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?

SK707
fonte
Alguma solução adequada?
Vishal Patel
Descobrir algo?
WorieN
Você encontrou uma solução?
Hamza Ezzaydia 29/03

Respostas:

4

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:

<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

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: insira a descrição da imagem aqui

kamest
fonte
3

Como você mencionou Restrições ao iniciar atividades em segundo plano

É afirmado que

O Android 10 (nível 29 da API) e superior impõem restrições quando os aplicativos podem iniciar atividades quando o aplicativo está sendo executado em segundo plano.

Eles também mencionaram em sua nota é isso.

Nota: Para fins de iniciar atividades, um aplicativo que executa um serviço em primeiro plano ainda é considerado "em segundo plano"

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

Muhammad Farhan
fonte
2

Você deve incluir no AndroidManifest.xml abaixo da permissão.

<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
mimu120
fonte
Eu também estou enfrentando esta questão, mas esta solução não está funcionando para mim
Rohit Sharma
@RohitSharma já encontrou alguma solução para este problema? ou ainda esperando por qualquer milagre.
asadullah 13/01
Ainda enfrentando esse problema, não obtive nenhuma solução perfeita para isso.
Rohit Sharma
Você encontrou uma solução?
Hamza Ezzaydia