如何在Android 10中从后台启动活动?


12

我正在构建一个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的后台启动活动吗?


任何适当的解决方案?
维沙尔·帕特尔

找出一些东西吗?
WorieN

您找到解决方案了吗?
Hamza Ezzaydia

Answers:


4

不知道这样做是否正确,但是我没有足够的时间(该应用仅供公司内部使用)。

我使用了权限:

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

然后每个用户都必须转到设置->应用程序的权限,然后在高级设置中选中功能“​​将应用程序展示给其他用户”

抱歉,我的英语不是完全正确的解决方案,但它确实有效,所以对我来说是很好的修复程序。

在Pixel 4上,它将如下所示: 在此处输入图片说明


3

正如您提到的,从后台开始活动的限制

据说

Android 10(API级别29)和更高的位置限制了应用程序在后台运行时何时可以启动活动。

他们在笔记中还提到的是。

注意:出于启动活动的目的,仍将运行前台服务的应用视为“后台”

这意味着,如果您使用前台服务来启动活动,它仍会认为该应用程序处于后台并且不会启动该应用程序的活动。

解决方案:首先,如果应用程序在Android 10(API级别29)及更高版本的后台运行,则无法启动。他们提供了克服这种行为,是不是调用应用程序,你可以展现出一种新的方式的高优先级通知全屏意图

全屏意图的行为例如在设备屏幕处于关闭状态时将启动您所需的应用活动。但是如果您的应用程序处于后台并且屏幕处于打开状态,那么它将仅显示一条通知。如果单击通知,它将打开您的应用程序。

有关“高优先级通知”和“全屏意图”的更多信息,请在此处进行检查。显示时间敏感通知


2

您应该在权限下方包含到AndroidManifest.xml中。

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

我也面临着这个问题,但是该解决方案对我不起作用
Rohit Sharma

@RohitSharma找到了解决此问题的任何方法了吗?或仍在等待任何奇迹。
asadullah

仍然面对这个问题,我没有得到任何完美的解决方案。
Rohit Sharma

您找到解决方案了吗?
Hamza Ezzaydia
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.