2

定期的なアラームとIntentServiceを使用してウェブサイトから定期的にデータを取得するアプリを構築しています。更新を実行する前に、ConnectivityManagerを使用してネットワーク接続を確認します。

ConnectivityManagerがアクティブなネットワークがないことを報告した場合、ネットワークがアクティブになったときに更新を再試行したいと思います。ConnectivityManager.CONNECTIVITY_ACTIONをリッスンしているBroadcastReceiverを使用するのがこれを行うための最良の方法のようですが、このレシーバーを登録/登録解除する適切な方法は何でしょうか。

IntentServiceでネットワークチェックが失敗した場合、BroadcastReceiverをApplicationContextに登録して、サービスの停止時に登録が解除されないようにすることができると思います。次に、受信者が起動したときに、受信者を独自のonReceiveメソッドで登録解除できますか?私は基地から離れていますか?

いくつかの疑似コード例:

MyIntentService:

if ( !isNetworkConnected() )
    getApplicationContext().registerReceiver( new MyBroadcastReceiver(), new IntentFilter( ConnectivityManager.CONNECTIVITY_ACTION );

MyBroadcastReceiver:

public void onReceive( Context context, Intent intent ) {
    context.getApplicationContext().unregisterReceiver( this );
4

1 に答える 1

1

私は自分の問題の解決策を見つけたと信じています。レシーバーをApplicationContextに登録すると、アプリプロセスが終了すると登録が解除されるため、機能しません。

これを処理する適切な方法は、マニフェストでレシーバーを宣言し、必要に応じてPackageManager.setComponentEnabledSettingを使用してレシーバーを有効/無効にすることだと思います(上記の2つの例の代わりに)。

したがって、マニフェストに無効(enabled = false)として登録してから、次のようにします。

MyIntentService:

protected void onHandleIntent( Intent intent ) {
    if ( !isNetworkConnected() )
        getPackageManager().setComponentEnabledSetting(
            new ComponentName( this, MyBroadcastReceiver.class ),
            PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
            PackageManager.DONT_KILL_APP );

MyBroadcastReceiver:

public void onReceive( Context context, Intent intent ) {
    getPackageManager().setComponentEnabledSetting(
        new ComponentName( this, MyBroadcastReceiver.class ),
        PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
        PackageManager.DONT_KILL_APP );
于 2012-10-13T00:18:57.830 に答える