2016-10-10 10 views
3

ユーザーがアンドロイドシステム時間を変更したときに、プリファレンスにブール値を保存します。従って、私はマニフェストに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); 
} 

}

すべてが正常に動作している - もう、バックグラウンドで走っていません。

ここでは述べています:


私はとにかく放送を受信し、ブール値を格納することができますどのように?

私は通知を見る必要はありません。 docsから

+0

'android:enabled =" true "'を 'android:name =" ... "属性の後ろまたは前に' 'の受信者に追加してみてください – Marat

+0

デフォルトで有効になっています^ –

+0

@Marat [link](https://developer.android.com/guide/topics/manifest/receiver-element.html) デフォルト値は "true"です。それは何も変わりません。 : – maryBlaa

答えて

1

アプリが終了するまですべてが正常に動作しています。これ以上バックグラウンドでは実行されません。

アプリケーションを強制停止し、その後に日付を変更するとログはありません。

あなたの所見は正しいものであり、通常の動作とみなされます。システム設定で「強制停止」を実行すると、BroadcastReceiverはAndroidManifest.xmlで宣言してもメッセージを受信しなくなります。 「強制停止」を実行すると、基本的にシステムに指示します。「このアプリケーションを今停止し、再度実行させない」。管理上の措置なので、システム設定からのみアクセスできます。これは理にかなっていますか?新しくインストールされたアプリでも同じことが言えます。少なくとも1回は起動するまで、ブロードキャストインテントは受信されません。

これはAndroidシステムの設計方法です。あなたはそれに対して何もすることはできません。

とにかく放送を受信して​​ブール値を保存するにはどうすればよいですか?

「強制停止」の後

、あなたのアプリケーション(またはそれの一つのコンポーネント)が手動で(再)再びユーザー少なくとも一度によって開始する必要があります。その場合、AndroidManifest.xmlで宣言された受信者は、システム全体を再起動しても期待どおりにブロードキャストインテントを受信します。

メモリが足りないなどの理由で、システムがアプリケーションを破壊する状況と「強制停止」を混同しないでください。これらは同じではありません。「強制停止」はアプリの永続的なフラグを設定し、アプリが再び実行されないようにします。

0

現在 がフォアグラウンドプロセスであると考えられている(現在、onReceive(コンテキスト、インテント)メソッド内のコードを実行つまり、 )BroadcastReceiverを実行しているプロセス極端なメモリ圧迫の場合を除いて、システムは によって実行され続けるでしょう。

その後

これは長いラン操作のためにあなたが頻繁にあなたの操作の全体の時間のためにアクティブに含む プロセスを維持するためにBroadcastReceiverと一緒に サービスを使用することを意味します。

だから、受信者のプロセスが高い優先度を持っていることを確認するために受信機を登録するサービスを実装する必要があると思います。

+0

どのように私はアンドロイドからACTION_TIME_CHANGEDブロードキャストを聞く終わりのないサービスを開始できますか? @Mina Samy – maryBlaa

+0

アプリケーションを強制停止すると、プロセスは終了します。そのため、アプリケーションのプロセスが再び稼動していない限り、受信者はイベントを受信できません。ユーザーがアプリを意図的に停止させたいので、これは正常な動作です。ここで説明する回避策については、アプリケーションが強制停止していてもプロセスを有効に保つことができるhttp://stackoverflow.com/a/21551045/235123 –

関連する問題