Jak rozpocząć aktywność z tła w Androidzie 10?


12

Tworzę aplikację na Androida, w której muszę rozpocząć aktywność od tła. Korzystam z ForegroundStarter, który rozszerza usługę, aby to osiągnąć. Mam aktywność Adscreen.class, którą muszę uruchomić z mojej usługi Foreground. Aktywność Adscreen.class działa dobrze (zaczyna się od tła) we wszystkich wersjach Androida z wyjątkiem Androida 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);

    }
}

Czytałem, że istnieją pewne ograniczenia dotyczące rozpoczynania działań od tła na Androidzie 10. Ten kod wydaje się już nie działać. 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);

Czy są jakieś obejścia, aby rozpocząć aktywność w tle na Androidzie 10?


Jakieś właściwe rozwiązanie?
Vishal Patel

Dowiedzieć się czegoś?
WorieN

Znalazłeś rozwiązanie?
Hamza Ezzaydia

Odpowiedzi:


4

Nie jestem pewien, czy warto to zrobić w ten sposób, ale nie miałem wystarczająco dużo czasu (aplikacja jest tylko do użytku wewnętrznego firmy).

Użyłem uprawnień:

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

a następnie każdy użytkownik musi przejść do ustawienia -> uprawnienia aplikacji, a następnie zaznaczyć pole wyboru w ustawieniach zaawansowanych dla funkcji „pokaż aplikację nad innymi”

Przepraszam za mój angielski lub nie do końca właściwe rozwiązanie, ale zadziałało, więc dla mnie dobra poprawka.

Na Pixelu 4 będzie to wyglądać tak: wprowadź opis zdjęcia tutaj


3

Jak wspomniałeś Ograniczenia dotyczące rozpoczynania działań od tła

Stwierdza się, że

Android 10 (poziom interfejsu API 29) i wyższe nakładają ograniczenia na to, kiedy aplikacje mogą rozpocząć działania, gdy aplikacja działa w tle.

Wspomnieli również w swojej notatce, że.

Uwaga: do celów rozpoczęcia działań aplikacja uruchamiająca usługę pierwszego planu jest nadal uważana za „w tle”

Oznacza to, że jeśli używasz usługi pierwszego planu, aby rozpocząć działanie, nadal uważa, że ​​aplikacja jest w tle i nie uruchomi działania aplikacji.

Rozwiązanie: Po pierwsze, nie można uruchomić aplikacji, jeśli działa ona w tle na Androidzie 10 (poziom interfejsu API 29) i wyższym. Udostępnili nowy sposób przezwyciężenia tego zachowania, polegający na tym, że zamiast dzwonić do aplikacji można wyświetlać powiadomienia o wysokim priorytecie z zamiarem wyświetlania na pełnym ekranie .

Intencja pełnoekranowa zachowuje się tak, jakby ekran Twojego urządzenia był wyłączony. Spowoduje to uruchomienie żądanej aktywności aplikacji. ale jeśli Twoja aplikacja działa w tle, a ekran jest włączony, wyświetli powiadomienie. Jeśli klikniesz powiadomienie, otworzy ono Twoją aplikację.

Aby uzyskać więcej informacji na temat powiadomień o wysokim priorytecie i zamiarów pełnoekranowych, możesz to sprawdzić tutaj. Wyświetlaj powiadomienia wrażliwe na czas


2

Powinieneś dołączyć do AndroidManifest.xml poniżej uprawnień.

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

Mam również do czynienia z tym problemem, ale to rozwiązanie nie działa dla mnie
Rohit Sharma

@RohitSharma znalazł już jakieś rozwiązanie tego problemu? lub wciąż czekam na jakikolwiek cud.
asadullah

Nadal borykam się z tym problemem, ale nie znalazłem dla niego idealnego rozwiązania.
Rohit Sharma

Znalazłeś rozwiązanie?
Hamza Ezzaydia
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.