2016-10-10 40 views
3

我想在用戶更改android系統時間時在首選項中存儲布爾值。因此,我加入ACTION_TIME_CHANGED到清單廣播動作:接收TIME_SET當應用程序關閉時廣播

<receiver android:name="test.TimeChangedReceiver"> 
    <intent-filter> 
     <action android:name="android.intent.action.TIME_SET" /> 
     <action android:name="android.intent.action.TIMEZONE_CHANGED" /> 
    </intent-filter> 
</receiver> 

的TimeChangedReceiver延伸的BroadcastReceiver和覆蓋的onReceive()。在這個類中,布爾值將被存儲並顯示通知。直到應用程序被關閉

public class TimeChangedReceiver extends BroadcastReceiver { 

private static final String TAG = "TimeChangedReceiver"; 

public TimeChangedReceiver() { 
    super(); 
} 

@Override 
public void onReceive(Context context, Intent intent) { 

    // store boolean to SharedPreferences 
    PreferenceUtils.getInstance().storeBoolean(true, PreferenceUtils.CHECK_LICENSE); 

    // build notification 
    int icon = android.R.drawable.ic_dialog_alert; 
    String title = "changed time"; 
    String text = "user changed time"; 

    long when = System.currentTimeMillis(); 
    String timezone = intent.getStringExtra("time-zone"); 
    Notification notification = new Notification(icon, title, when); 
    NotificationManager mgr = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); 
    int notification_id = (int) System.currentTimeMillis(); 
    Intent notificationIntent = new Intent(context, MainView.class); 
    notificationIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    notificationIntent.putExtra("time-zone", timezone); 
    PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, PendingIntent.FLAG_ONE_SHOT); 
    notification.setLatestEventInfo(context, title, text, contentIntent); 
    mgr.notify(notification_id, notification); 
} 

}

一切工作正常 - 在後臺不捉迷藏了。

這說:


我怎樣才能收到反正廣播和存儲布爾?

我不需要看到通知。

+0

嘗試在'android:name =「...」'屬性 – Marat

+0

之後或之前在'內爲''接收器添加'android:enabled =「true」'它默認啓用^ –

+0

@Marat [鏈接](https://developer.android.com/guide/topics/manifest/receiver-element.html) 默認值爲「true」。它沒有改變。 :( – maryBlaa

回答

1

一切工作正常,直到應用程序關閉 - 不再在後臺運行。

當我「強行停止」應用程序並在之後更改日期時,沒有日誌。

你的觀察是正確的,被認爲是正常的行爲。通過系統設置完成「強制停止」後,即使您在AndroidManifest.xml中聲明它們,BroadcastReceiver也不會再收到消息。通過執行「強制停止」,您基本上指示系統:「現在停止此應用程序,不要讓它再次運行」。這是一項管理行爲,因此只能從系統設置訪問。這有道理不是嗎?新安裝的應用程序也是如此。在開始至少一次之前,它不會收到任何廣播意圖。

這就是Android系統的設計原理。你不能對此做任何事情。

我該如何接收廣播並存儲布爾值?

一個「強行停止」後,您的應用程序(或它的一個組件)必須手動(重新)由用戶至少一次再次開始。在這種情況下,在AndroidManifest.xml中聲明的接收器即使在完全重新啓動系統後也會收到預期的廣播意圖。

您不應該將「強制停止」與系統破壞您的應用程序的情況混淆(例如由於缺乏內存)。這些不一樣,因爲「強制停止」爲您的應用程序設置了一個永久性標誌,防止其再次運行。

0

docs

當前正在執行一個BroadcastReceiver的方法(即, 當前運行在其的onReceive(上下文,意圖)方法的代碼) 被認爲是前臺進程並且除了存在極大的記憶壓力的情況之外,將通過系統保持運行 。

然後

這意味着,對於長時間運行的操作,你會經常一起使用 服務有一個BroadcastReceiver保持含 過程中積極爲您的操作的全部時間。

所以我想你需要實現一個服務,註冊接收器,以確保接收器的進程具有高優先級,從而保持運行。

+0

我怎麼能啓動一個永不結束的服務,聽從android的ACTION_TIME_CHANGED廣播? @Mina Samy – maryBlaa

+0

當您「強制停止」應用程序時,進程將被終止,因此除非應用程序的進程再次生效,否則接收方無法接收事件。這是一種正常行爲,因爲用戶想要故意強制停止你的應用。一個解決方法在這裏描述http://stackoverflow.com/a/21551045/235123在哪裏你可以保持你的進程活着,即使應用程序是強制停止 –

相關問題