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

Sha*_*awn 9 android broadcastreceiver android-intent android-activity

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

  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);
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

Dav*_*ser 9

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

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

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

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


And*_*rey 9

因为你需要像这样的行为

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);
}
Run Code Online (Sandbox Code Playgroud)