当前位置: 首页 > 知识库问答 >
问题:

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

蒲功
2023-03-14

我正在构建一个android应用程序,我需要从后台开始一项活动。我正在使用ForegroundStarter来扩展服务,以实现这一点。我有一个活动屏幕。我需要从前台服务运行的类。活动的广告屏幕。除了Android10,其他所有Android版本的课程都可以正常运行(从后台开始)。

前场先发。班

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);

    }
}

我读到在Android10上从后台启动活动有一些限制。这个代码似乎不再有效了。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);

在Android10上从后台启动活动有什么变通方法吗?

共有3个答案

何涵衍
2023-03-14

我没有足够的声誉来评论这个解决方案https://stackoverflow.com/a/59067224/8995217所以我试着把我的答案留给MIUI rom

似乎需要为在小米手机上运行的应用程序授予一些权限。转到手机设置-

在应用信息页面转到其他权限并启用以下选项

  • 在锁定屏幕上显示
  • 在后台运行时显示弹出窗口
  • 永久通知

适用于小米红米Note 8T

贺卜霸
2023-03-14

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

据说

Android 10(API级别29)和更高版本对应用程序在后台运行时可以启动活动的时间进行了限制。

他们在便条中还提到:。

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

这意味着如果您使用前台服务启动活动,它仍然认为应用程序在后台,不会启动应用程序活动。

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

全屏意图的行为例如如果您的设备屏幕关闭它将启动您想要的应用程序活动。但如果您的应用程序在后台并且屏幕打开,那么它将只显示一个通知。如果您单击通知,它将打开您的应用程序。

有关高优先级通知和全屏意图的更多信息,您可以在此处查看显示时间敏感的通知

陆敏学
2023-03-14

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

我使用了权限:

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

然后每个用户都必须进入设置-

对不起我的英语或不完全正确的解决方案,但它工作了,所以很好的热修复补丁对我来说。

 类似资料:
  • 问题内容: 我正在尝试将Shell脚本移植到可读性更高的python版本。原始的shell脚本在后台使用“&”启动多个进程(实用程序,监视器等)。如何在python中达到相同的效果?我希望这些过程在Python脚本完成后不会消失。我敢肯定它与守护程序的概念有关,但是我找不到如何轻松实现此目的。 问题答案: 注意:此答案的最新版本比2009年发布时要少。现在建议在文档中使用其他答案中显示的模块 (请

  • 前提条件: AndroidQ 问题一: 我在前台有一个视图,当用户单击该视图时,我尝试在android Q中启动一个活动。 以下是我的代码。 它不工作,也不会发生碰撞。我有一些日志。 D ActivityTaskManagerServiceInjector: MIUILOG-权限拒绝活动:意图... 问题2: 我有一个TileService,当用户单击状态栏中的图标时,我尝试启动一个活动 雄激素单

  • 我在中有一组选项卡,每个选项卡都包含自己的片段。当我尝试通过从该片段中启动一个新活动并使用方法时,我的应用程序强制关闭。 在四处寻找了一段时间后,我找到了一个名为startActivityFromFragment的方法的一两个引用,但在搜索了大约一个小时后,我找不到任何关于如何使用它或这是否是我应该使用的方法的解释或示例。 我想我要问的是,从一个活动启动一个新活动和从一个片段启动一个新活动之间是否

  • 问题内容: 我在应用程序中使用selenium+ phantomjs,但我想在后台启动我的应用程序,selenium和phantomjs窗口。我该怎么做? 我试过了: 问题答案:

  • 好吧,所以我有点困惑该怎么处理这个。因此,我有了主活动,从那里可以启动一个活动到DegreePlan活动,从那里可以启动另一个活动到EditDegreeplan。我已经将EditDegreeplan设置为在Android清单中没有历史记录。问题是在他们保存EditDegreeplan后,它会启动一个活动到Degreeplan。因此,如果用户按下后退键,他们必须按两次才能再次进入主活动。我想摆脱它,

  • 问题内容: 我正在尝试创建一个具有ActivityList信息的简单Android应用程序,当该应用程序启动时,我计划启动一个将不断计算数据(它将不断变化)的服务,并且我希望ActivityList与之同步服务在应用程序生命周期内正在计算的数据。 如何设置我的活动以收听服务?这是解决此问题的最佳方法吗? 例如,如果您想象一个股票价格列表,则该数据将定期更改,并且需要与不断计算/获取数据的(在我的情