繁体   English   中英

Android - 从广播接收器启动应用程序

[英]Android - launch app from broadcast receiver

我希望广播接收器以这种方式启动我的应用程序:

  1. 如果应用程序不在前台或后台,请将其启动,就好像它是从启动器启动一样。

  2. 如果应用程序在后台,请将其带到最后一个状态的前台。

  3. 如果应用程序位于前台,则不执行任何操作。

这是我的代码:

@Override
public void onReceive(Context context, Intent intent) {
        Intent launch_intent = new Intent("android.intent.action.MAIN");
        launch_intent.setComponent(new ComponentName("com.example.helloworld","com.example.helloworld.MainActivity"));
        launch_intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
        launch_intent.addCategory(Intent.CATEGORY_LAUNCHER);
        launch_intent.putExtra("some_data", "value");
        context.startActivity(launch_intent);
}

MainActivity是我的根活动。 就像我说的,如果应用程序已经运行,我只是想把它带到前面而不改变它的状态。 如果在MainActivity之上有一些活动,请保持原样。

大多数情况下上面的代码工作正常,但有时我注意到应用程序重新启动(或状态被重置 - 根回到顶部)当它从后台运行时。

我应该使用什么代码? 任何帮助表示赞赏!

您不需要编写所有代码。 您可以使用“启动Intent”,如下所示:

PackageManager pm = context.getPackageManager();
Intent launchIntent = pm.getLaunchIntentForPackage("com.example.helloworld");
launchIntent.putExtra("some_data", "value");
context.startActivity(launchIntent);

但是,您的代码也应该有效。

如果你说大部分时间都有效,那么在这种情况下你可能会看到一个令人讨厌的旧版Android错误。 当您第一次直接从安装程序或通过IDE(Eclipse,Android Studio等)启动应用程序时,会发生这种情况。 您应该首次直接从HOME屏幕或已安装的应用列表启动您的应用。 有关这个令人沮丧的Android错误的更多信息,请参阅https://stackoverflow.com/a/16447508/769265

因为你需要像这样的行为

1)如果应用程序不在前台或后台,请将其启动,就像从启动器启动一样。

2)如果应用程序在后台,请将其带到最后一个状态的前台。

3)如果应用程序在前台,则不执行任何操作。

考虑:

@Override
public void onReceive(Context context, Intent intent) {

    Intent startIntent = context
            .getPackageManager()
            .getLaunchIntentForPackage(context.getPackageName());

    startIntent.setFlags(
                    Intent.FLAG_ACTIVITY_REORDER_TO_FRONT |
                    Intent.FLAG_ACTIVITY_NEW_TASK |
                    Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
    );
    context.startActivity(startIntent);
}
@Override
public void onReceive(Context context, Intent intent) {
    Intent launch_intent = new  Intent(context, MainActivity.class);
    launch_intent.setComponent(new ComponentName("com.example.helloworld","com.example.helloworld.MainActivity");
    launch_intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP |INTENT.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
    launch_intent.putExtra("some_data", "value");
    launch_intent.addCategory(Intent.CATEGORY_LAUNCHER);
    context.startActivity(launch_intent);
}

这很简单,但除非您在尝试从意图中获取额外数据时知道正确的方法,否则通常会得到一个java空指针异常。

使用onNewIntent()方法接收额外数据。 如果你想知道如何评论如下。

编辑:尝试以下操作。 但我不明白的是我给你的第一个代码应该自己工作。 它一直对我有用。 你确定已经复制了我给你的第一个代码并粘贴它而不做任何改动吗?

编辑2:如果这不起作用尝试将标志设置为clearTaskOnLaunch而不是INTENT.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED

假设您已经知道BroadcastReceiver,您只需要像通常在onReceive上那样进行启动:因此它看起来像这样

@Override
public void onReceive(Context context, Intent intent) {
    Intent launch_intent = new Intent("android.intent.action.MAIN");
    launch_intent.putExtra("some_data", "value");
    tiapp.startActivity(launch_intent);
}

如果它之前启动,它将只恢复该Activity,如果没有,它将启动一个新的

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM