簡體   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