android 通过点击应用小部件来打开具有返回堆栈的现有Activity,方式?

h4cxqtbf  于 2022-11-03  发布在  Android
关注(0)|答案(2)|浏览(117)

我想通过点击应用程序小部件来打开我的应用程序。

remote_views.setOnClickPendingIntent( R.id.layout, PendingIntent.getActivity( context, 0, new Intent( context, Main.class ).setFlags( Intent.FLAG_ACTIVITY_NEW_TASK ), PendingIntent.FLAG_IMMUTABLE ) );

但我想打开现有的应用程序并保留堆栈。如果我删除Intent.FLAG_ACTIVITY_NEW_TASK,那么在新的Android上,我会得到:
java.lang.RuntimeException:导致错误:从“活动”上下文外部调用startActivity()需要FLAG_ACTIVITY_NEW_TASK标志。
我可以在清单文件中设置

<activity
        android:name=".Main"
        android:launchMode="singleInstance"
        android:exported="true"
        >

并打开现有活动,但丢失了回栈,此外,然后按下主页按钮,并通过图标再次启动应用程序,然后也丢失了回栈。
那么,这可能吗?

wh6knrhe

wh6knrhe1#

使用一个启动Intent。这将把现有的任务带到前台,无论它处于什么状态。如果它还没有运行,它将以用户点击主屏幕中的应用程序图标时的方式启动它:

remote_views.setOnClickPendingIntent( R.id.layout,
    PendingIntent.getActivity(
        context, 0,
        context.getPackageManager().getLaunchIntentForPackage("my.package.name"),
        PendingIntent.FLAG_IMMUTABLE ) );

您不需要在MainActivity的清单中使用任何特殊的启动模式。

js4nwp54

js4nwp542#

我不确定这是正确的方式,但它是工程。
1.在主活动android:launchMode="singleTop"的清单文件中设置。
1.在ocCreate()方法中的主要活动中:

if( !isTaskRoot() ){
     finish();
 }

因此,如果系统通过点击小工具(taskId将相同)打开新的主活动,并将其放在回栈顶部,然后完成它。

相关问题