[英]Android - launch app from broadcast receiver
我希望廣播接收器以這種方式啟動我的應用程序:
如果應用程序不在前台或后台,請將其啟動,就好像它是從啟動器啟動一樣。
如果應用程序在后台,請將其帶到最后一個狀態的前台。
如果應用程序位於前台,則不執行任何操作。
這是我的代碼:
@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.