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

从状态栏启动应用程序,无需重新创建

别永年
2023-03-14

我正在创建在状态栏中显示通知图标的应用程序。当用户打开状态栏并点击图标时,应用程序应该被启动。

我正在寻找一种方法来避免在这次发布期间重新创建应用程序。我已经创建了测试应用程序,并将日志消息添加到处理程序onCreate、onRestart、onResume、onStop和onDestroy中。日志消息说明了问题:

  1. 用户启动应用程序-onCreate、onResume

步骤7的行为与步骤3和5的行为不同--这里有onDestroy。换句话说,应用程序的实例被重新创建。是否可以避免这种重新创建?

这是我测试活动的代码:

public class MainActivity extends Activity {
    private final String LOG_TAG = "com.example.notificationtest";

    @Override protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        showNotification(this);
        Log.d(LOG_TAG, "NotificationTest: OnCreate");
    }

    @Override protected void onRestart() {
        super.onRestart();
        Log.d(LOG_TAG, "NotificationTest: OnRestart");
    }

    @Override protected void onResume() {
        super.onResume();
        Log.d(LOG_TAG, "NotificationTest: OnResume");
    }

    @Override protected void onDestroy() {
        super.onDestroy();
        Log.d(LOG_TAG, "NotificationTest: OnDestroy");
    }

    @Override protected void onStop() {
        super.onStop();
        Log.d(LOG_TAG, "NotificationTest: OnStop");
    }


    private static final int NOTIF_ID = 91371;

    public static void showNotification(Context context) {
        final Intent result_intent = new Intent(context, MainActivity.class);
        result_intent.setAction(Intent.ACTION_MAIN);
        result_intent.addCategory(Intent.CATEGORY_LAUNCHER);
        //result_intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        //result_intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
        //result_intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);                

        TaskStackBuilder stack_builder = TaskStackBuilder.create(context);
        stack_builder.addParentStack(MainActivity.class);
        stack_builder.addNextIntent(result_intent);

        PendingIntent pending_intent = stack_builder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);

        android.support.v4.app.NotificationCompat.Builder builder = new android.support.v4.app.NotificationCompat.Builder(context);

        Resources res = context.getResources();
        builder.setContentIntent(pending_intent)
            .setSmallIcon(R.drawable.ic_launcher)
            .setLargeIcon(BitmapFactory.decodeResource(res, R.drawable.ic_launcher))
            .setTicker("test")
            .setWhen(System.currentTimeMillis())
            .setAutoCancel(false)
            .setContentTitle("title")
            .setContentInfo("cinfo")
            .setContentText("ctext");
        Notification n = builder.build();
        n.flags = Notification.FLAG_ONGOING_EVENT | Notification.FLAG_NO_CLEAR;   

        NotificationManager nm = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
        nm.notify(NOTIF_ID, n);     
    }
}

有一些标志可以设置为结果意图,比如标志活动清除顶部、标志活动清除任务和标志活动新任务。它们允许指定活动应该在启动时重新启动(使用活动启动模式“singleTop”、“singleTask”等)。但是应该设置什么标志来避免重新启动?也许我应该以某种方式配置挂起的意图?

任何帮助都将不胜感激。

解决了的

非常感谢你的回答,问题解决了。

这里描述了同样的问题。我已经检查了这个主题的测试项目,发现了与我的代码不同的地方。为了解决这个问题,我的代码应该按照以下方式进行更改:

final Intent result_intent = new Intent(context, MainActivity.class);
//result_intent.setAction(Intent.ACTION_MAIN); // (1)
//result_intent.addCategory(Intent.CATEGORY_LAUNCHER); // (2)
result_intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);

另一组标志也起作用:

result_intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); 

要点是注释行(1)和(2)

共有1个答案

后易安
2023-03-14

添加这个:

result_intent..setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
                                    | Intent.FLAG_ACTIVITY_NEW_TASK);

它就像

意图FLAG_ACTIVITY_REORDER_TO_FRONT

还维护活动堆栈

 类似资料:
  • 问题内容: 我愿意在应用程序中添加一个按钮,单击该按钮将重新启动该应用程序。我搜索谷歌,但没有发现任何有用的,除了这一个。但是,此处遵循的过程违反了Java的WORA概念。 是否有其他以Java为中心的方法来实现此功能?是否可以只派生另一个副本然后退出? 提前致谢。我感谢您的帮助。 @deporter我已经尝试过您的解决方案,但是它不起作用:( @mKorbel我写的,采取的概念下面的代码,你曾在

  • 我已经将我的应用程序升级到了API 26,我面临着一些新的后台执行限制问题。 在Oreo设备上,只要我的应用程序进入后台,我的应用程序就会因日志中写入的空闲状态而被操作系统停止: 然后,我尝试再次启动我的应用程序,最后一个活动被正确还原(包括其片段和所有显示的数据) 问题是我的服务没有重新启动。 它们都在onstart命令中返回START_STICKY,该命令应该告诉操作系统,服务在被终止后应该重

  • 我正在构建一个应用程序,带有页面导航,需要在某些页面上显示状态栏,并在其他页面上隐藏它。我想使用淡入/淡出动画,所以我必须设置 并像这样更新状态栏: 当在页面之间导航时,这个过程非常有效,但我无法在启动时摆脱状态栏。 我试过设置: 将其添加到 将此添加到AppDelegates完成启动时使用了以下选项: 将其添加到初始页面的ViewController: 以及在链接的情节提要元素中将“状态栏”设置

  • 问题内容: 如何重新启动Java AWT应用程序?我有一个附加了事件处理程序的按钮。我应该使用什么代码来重新启动应用程序? 我想做与应用程序中相同的事情。 问题答案: 当然,可以重新启动Java应用程序。 以下方法显示了一种重新启动Java应用程序的方法: 基本上,它执行以下操作: 查找Java可执行文件(我在这里使用了Java二进制文件,但这取决于您的要求) 查找应用程序(在我的情况下是一个ja

  • 我在Spring boot应用程序中定义了多个配置文件,通常用于不同的场景。 在运行时,我正在寻找一种方法来激活配置文件,而不需要重新启动应用程序。 我知道Spring cloud config提供了一种通过使用actuator/Refreshendpoint重新启动应用程序来外部化配置和重新加载的方法。 我将Spring Cloud Config为应用程序维护的外部化配置中的属性Spring.p

  • 我正在写一个UWP应用程序,我有一个ScheduledToastNotification在应用程序挂起时添加到日程中(例如,像一个提醒)。但是,如果我关闭了app,通知准时出现,但是当我点击通知时(没有按钮,一般只是在通知上),app没有正确启动,停在闪屏处。 如何使应用程序正确地重新启动? 多谢了。