我正在构建一个Android应用,我需要从后台开始活动。我正在使用ForegroundStarter来扩展Service来完成此任务。我有一个活动Adscreen.class,需要从我的前台服务中运行。活动Adscreen.class在除Android 10以外的所有Android版本上都可以正常运行(从后台开始)。
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上从后台启动活动吗?
答案 0 :(得分:6)
您提到的Restrictions on starting activities from the background
据说
Android 10(API级别29)以及更高的位置限制,以限制应用程序在后台运行时何时可以启动活动。
他们在笔记中还提到的是。
注意:出于开始活动的目的,仍将运行前台服务的应用视为“后台”
这意味着,如果您使用前台服务来启动活动,它仍会认为该应用程序处于后台并且不会启动应用程序活动。
解决方案:首先,如果该应用在Android 10(API级别29)及更高版本的后台运行,则无法启动该应用。他们提供了一种解决此问题的新方法,即您可以显示高优先级通知和全屏意图,而不是调用应用程序。
全屏意图的行为例如在设备屏幕处于关闭状态时将启动您所需的应用活动。但是如果您的应用程序处于后台并且屏幕处于打开状态,那么它将仅显示一条通知。如果您单击通知,它将打开您的应用程序。
有关“高优先级通知”和“全屏意图”的更多信息,请在此处Display time-sensitive notifications
进行检查。答案 1 :(得分:2)
您应在权限下方将其包含在AndroidManifest.xml中。
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
答案 2 :(得分:1)
我没有足够的声誉来评论解决方案https://stackoverflow.com/a/59067224/8995217 所以我尝试将答案留给MIUI rom
对于小米手机上运行的应用,似乎需要获得一些权限。 转到手机设置->应用程序->管理应用程序,然后找到您的应用程序。
在app info页上转到other permissions 并启用以下选项
它适用于小米Redmi Note 8T
答案 3 :(得分:0)
不确定这样做是否正确,但是我没有足够的时间(应用仅供公司内部使用)。
我使用了权限:
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
然后每个用户都必须进入设置->应用程序的权限,然后在高级设置中选中功能“将应用程序显示给其他用户”
对不起,我的英语水平或解决方案都不正确,但很有效,对我来说是个很好的修复程序。