![](/img/trans.png)
[英]Android : Activity not called from BroadcastReceiver when app is in background
[英]Send data from BroadcastReceiver to activity, while app is in background
我正在Android Studio中編寫代碼,但是正在編寫的項目沒有GUI,並且永遠不會為用戶更新視圖。 它只是使用廣播接收器監聽最后安裝的應用程序,然后將信息發送到另一個Java文件。
我想知道如何從廣播接收器向活動發送字符串(也許這不應該是“活動”而是“服務”嗎?),並且在應用程序處於后台時進行這項工作。
現在,我有一個廣播接收器,正在偵聽手機上最后安裝的應用程序(此應用程序在后台運行)。 我設置了一個自定義廣播接收器,以在廣播接收器安裝了應用程序時通知我的主要活動。 但是此自定義接收器無法在后台運行。 同樣,也許我不應該使用Activity從BroadcastReceiver接收信息?
在后台運行應用程序時,是否可以將信息從廣播接收器發送到主要活動? 我還需要我的主要活動來在后台恢復正常功能(在后台時沒有完成GUI更新)。
我的BroadcastReceiver通過新的Intent向我的主活動發送數據
public class NewInstallReceiver extends BroadcastReceiver {
ApplicationInfo ai;
@Override
public void onReceive(Context context, Intent intent) {
final PackageManager pm = context.getPackageManager();
try {
// if app is added, get package info
ai = pm.getApplicationInfo(intent.getData().getSchemeSpecificPart(), 0);
Intent i = new Intent("broadcastName");
// Data pass to activity
i.putExtra("appInfo", ai);
context.sendBroadcast(i);
} catch (final PackageManager.NameNotFoundException e) {
ai = null;
}
}
}
在onCreate的MainActivity中,我注冊接收者:
registerReceiver(broadcastReceiver, new IntentFilter("broadcastName"));
我從BroadcastReceiver接收數據
BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// get applicationInfo
Bundle b = intent.getExtras();
Object applicationInfo = b.get("appInfo");
ApplicationInfo appInfo = (ApplicationInfo) applicationInfo;
getNewData(appInfo);
}
};
然后,我必須在MainActivity中注銷接收器,但是很明顯,一旦應用程序進入后台,這顯然不允許我從BroadcastReceiver接收信息。
@Override
public void onStop()
{
try{
unregisterReceiver(broadcastReceiver);
}
catch(Exception e){
System.out.println("Exception is " + e.toString());
}
super.onStop();
}
老實說,我認為更新處於后台的活動不是一個好習慣(即使可能)。
根據DOCS :
活動是用戶可以做的一件專注的事情。 幾乎所有活動都與用戶進行交互,因此Activity類負責為您創建一個窗口,您可以在其中放置帶有setContentView(View)的UI。 盡管活動通常以全屏窗口的形式呈現給用戶,但它們也可以以其他方式使用:作為浮動窗口...或嵌入到另一個活動中(使用ActivityGroup)。
因此,如果“活動”在后台,則它是不可見的。 因此,更新其內容是無用的(因為它對用戶不可見)。
實際上,您應該改為實現以下行為:
僅將您的服務用於保存信息(在數據庫/內容提供程序中),並通知活動有新信息可用。 然后,如果您的活動處於打開狀態,它將立即使用該信息。 如果未打開“活動”,則該信息將保留,以備用戶需要時使用。
如果僅停止了應用程序,則可以在onResume()
方法期間更新“活動”內容。
如果您的應用被殺死並被用戶再次打開,則可以在onCreate()
方法期間更新所有視圖。 在向用戶顯示視圖之前,將調用onCreate()
。
這樣,信息將在需要時進行更新: 當用戶要檢查信息時 。 否則,那是浪費時間。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.