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?
android
foreground-service
SK707
źródło
źródło
Odpowiedzi:
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ń:
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:
źródło
Jak wspomniałeś Ograniczenia dotyczące rozpoczynania działań od tła
Stwierdza się, że
Wspomnieli również w swojej notatce, że.
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
źródło
Powinieneś dołączyć do AndroidManifest.xml poniżej uprawnień.
źródło