![](/img/trans.png)
[英]GCM BroadcastReceiver fired only when app is running or running at background
[英]When my app is not running (only when not running), why does my BroadcastReceiver give me a nullpointer exception?
我將嘗試總結一下,因為我的原始代碼很長。 假設我的廣播接收器是這樣的:
public class SMSBroadcastReceiver extends BroadcastReceiver {
static ArrayList<String> phonenumber_array = new ArrayList<String>();
static ArrayList<String> message_array = new ArrayList<String>();
@Override
public void onReceive(Context context, Intent intent) {
Bundle bundle = intent.getExtras();
if (bundle != null) {
Object[] pdus = (Object[]) bundle.get("pdus");
SmsMessage[] sms = new SmsMessage[pdus.length];
for (int i = 0; i < sms.length; i++) {
sms[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
phonenumber_array.add(0,sms[i].getOriginatingAddress());
message_array.add(0,sms[i].getMessageBody());
com.test.ListActivityClass.myadapter.notifyDataSetChanged();
}
}
在我的AndroidManifest.xml中,BroadcastReceiver具有IntentFilter“ android.provider.Telephony.SMS_RECEIVED”。
我的ListActivityClass擴展了ListActivity,包含一個myadapter,它是一個ArrayAdapter,例如:myadapter = new CustomAdapter(this,com.test.SMSBroadcastReceiver.phonenumber_array,com.test.SMSBroadcastReceiver.message_array)
所以我的問題是:我從Eclipse向模擬器發送短信。 每當myadapter.notifyDataSetChanged(); 當我的應用程序未運行(完全停止,沒有啟動任何進程,沒有任何活動)時,在我的BroadcastReceiver中調用,則出現nullpointer異常。
當我刪除myadapter.notifyDataSetChanged(); 問題解決了。
當應用程序運行時,也沒有問題,我的應用程序可以正確獲取收到的新短信並將其顯示在列表中。
所以我的猜測是=當應用程序運行時,BroadcastReceiver可以檢測到myadapter,因為該應用程序在內存中,因此可以通知更改。 當應用程序未運行時,它不在內存中,因此BroadcastReceiver無法看到任何myadapter,因此它給出了nullpointer異常。 這說得通。 因此,我嘗試檢查:如果進程在內存中,請通知更改,否則,不要通知(因為我的應用程序獲取了onCreate()收到的所有短信,因此沒有必要。
ActivityManager activityManager = (ActivityManager) context
.getSystemService(context.ACTIVITY_SERVICE);
List<RunningAppProcessInfo> runningProcInfo = activityManager
.getRunningAppProcesses(); for (int i1 = 0; i1 <
runningProcInfo.size(); i1++) {
if (runningProcInfo.get(i1).processName.equals("com.test")) {
com.test.ListActivityClass.myadapter.notifyDataSetChanged();
}
但是什么都沒有改變。 應用未運行時,我仍然存在nullpointer異常。
最糟糕的是,我試圖用phonenumber_array.add(0,“ somephonenumber”);替換phonenumber_array; 和message_array.add(0,“ somemessage”); 檢查即使應用已關閉,BroadcastReceiver是否在后台運行,我的想法是正確的。 在出現空指針異常之后,我啟動了該應用程序,並且同時存在somephonenumber和somemessage。
我想念什么? BroadcastReceiver是在后台運行還是僅在應用程序啟動時運行? 怎么了?
您可以創建靜態布爾變量onScreen
,並將其設置為true
在onResume
方法,並設置為false
的onPause
方法。 這是了解應用程序是否在屏幕上的最簡單方法
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.