Android - 来自广播接收器

时间:2015-08-19 01:02:03

标签: android android-intent android-activity broadcastreceiver

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

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

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

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

  4. 这是我的代码:

    @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之上有一些活动,请保持原样。

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

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

4 个答案:

答案 0 :(得分:8)

您不需要编写所有代码。您可以使用"启动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 :(得分:3)

因为你需要像

这样的行为

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

答案 2 :(得分:1)

@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()方法接收额外数据。如果你想知道下面的评论如何。

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

<强> EDIT2: 如果这不起作用,请尝试将标志设置为clearTaskOnLaunch而不是INTENT.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED

答案 3 :(得分:0)

假设您已经知道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);
}

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