Я создаю приложение для Android, где мне нужно начать деятельность из фона. Я использую ForegroundStarter, который расширяет Сервис для достижения этой цели. У меня есть активность Adscreen.class, которую мне нужно запустить из службы Foreground. Задание Adscreen.class прекрасно работает (начинается с фона) на всех версиях Android, кроме 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);
}
}
Я читал, что есть некоторые ограничения на запуск действий из фона на Android 10. Этот код, похоже, больше не работает. 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);
Какие-нибудь обходные пути, чтобы начать деятельность из фона на Android 10?
Ответы:
Не уверен, правильно ли это делать таким образом, но у меня не было достаточно времени (приложение предназначено только для внутреннего использования компанией).
Я использовал разрешения:
а затем каждый пользователь должен перейти к настройке -> разрешения приложения и затем установить флажок в дополнительных настройках для функции «показать приложение поверх других»
Извините за мой английский или не совсем правильное решение, но это сработало, так что исправление для меня.
На Pixel 4 это будет выглядеть так:
источник
Как вы упомянули Ограничения на начало деятельности из фона
Установлено, что
Они также упомянули в своей записке, что это.
Это означает, что если вы используете службу переднего плана для запуска действия, он по-прежнему считает, что приложение находится в фоновом режиме и не будет запускать действие приложения.
Решение. Во-первых, вы не можете запустить приложение, если оно работает в фоновом режиме с Android 10 (уровень API 29) и выше. Они предоставили новый способ преодоления этого поведения, заключающийся в том, что вместо вызова приложения вы можете показывать высокоприоритетное уведомление с полноэкранным режимом .
Полноэкранное задание ведет себя так, как будто экран вашего устройства выключен. Запустится приложение «Активность», которое вы хотели. но если ваше приложение работает в фоновом режиме, а экран включен, то оно просто покажет уведомление. Если вы нажмете на уведомление, то откроется ваше приложение.
Для получения дополнительной информации о приоритетных уведомлениях и полноэкранных намерениях вы можете проверить их здесь. Отображение чувствительных ко времени уведомлений.
источник
Вы должны включить в AndroidManifest.xml ниже разрешения.
источник