2017-01-07 22 views
1

Activityのバックグラウンドプロセスの結果を取得するにはどうすればよいですか?任意のアクティビティでバックグラウンドプロセスからの警告ダイアログを表示

私はOTAのアップデートをしています。アプリケーションハンドラーでバックグラウンドでそれを処理します。更新が完了したら、ユーザーに警告ダイアログを表示する必要があります。私はSettingsActivityにそれを示すことができます。私はOTAで始まりますが、ユーザーは他のいずれでもActivityに入ることができます。

private void checkIsUpdated() { 
    final Handler handler = new Handler(); 
    handler.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      mDevice.getDevice().read(GattUUID.LS_DEVICE_INFORMATION, GattUUID.LC_FIRMWARE, new 
        BleDevice.ReadWriteListener() { 
         @Override 
         public void onEvent(ReadWriteEvent e) { 
          if (e.wasSuccess()) { 

           if (firmwareVersion.equals(e.data_string())) { 
            showAlertDialog("OTA update failed", "Device is not updated"); 

           } else { 
            showAlertDialog("OTA update is successful.\nDevice is updated to new " + 
              "firmware!", "Device is updated"); 

           } 

           Log.i("OTA", "Read firmware is new success"); 
          } else { 
           Log.e("OTA", "Read firmware is new success"); 
          } 
         } 
        }); 
     } 
    }, 30000); 
} 

AlertDialogコード

private void showAlertDialog(String message, String title) { 

    AlertDialog.Builder builder = new AlertDialog.Builder(mContext, R.style.SwipeDialogLight); 
    builder.setTitle(title) 
      .setMessage(message) 
      .setCancelable(false) 
      .setPositiveButton("OK", new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        dialog.dismiss(); 
       } 

      }); 

    AlertDialog alert = builder.create(); 
    if (!alert.isShowing()) { 
     alert.show(); 
    } 
} 
+1

は、あなたがこのために放送受信機を試してみましたか? – rogerwar

+0

私はすべての活動に登録する必要がありますか? – Adnan

+0

私はちょうど警告ダイアログのために、あなたのアプリケーションのスプラッシュ画面からそれを登録すると思います。 – rogerwar

答えて

2

@ W4R10CKが述べたように、私はそれも考えました。 BroadcastReceiverはあまり良い考えではないかもしれません。しかし、後で、私はそれについて考えを与え、あなたがServiceの中でcheckIsUpdatedの機能を呼び出してBroadcastを送るなら、それは実行可能な解決策かもしれません。

したがって、基本的にBaseActivityクラスが必要で、BroadcastReceiverが必要です。 onResumeを登録して、再度の登録を解除する必要があります。

Activityのそれぞれでabstractメソッドをオーバーライドする必要があります。

は、だからあなたBaseActivityは次のようになります。..

public abstract class BaseActivity extends AppCompatActivity { 

    private final Context context; 

    public BaseActivity() { 
     this.context = setContext(); 
    } 

    protected abstract Context setContext(); 

    @Override 
    public void onResume() { 
     super.onResume(); 
     registerBroadcastReceiver(); 
    } 

    @Override 
    public void onPause() { 
     super.onPause(); 
     unRegisterBroadcastReceiver(); 
    } 

    // Declare your BroadcastReceiver here 
    private class MyBroadcastReceiver extends BroadcastReceiver { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      showAlertDialog(context); 
     } 
    } 
} 
+0

これは良い解決策です。また、BroadcastRecieverはスレッドで実装するのは良い考えではありません。良い解決策。 – W4R10CK

2

@rogerwarコメントで示唆したように、正しいアプローチは、放送受信機です。

Vogellaはあなたがすべての活動にそれを持ってしたいので、あなたはすべてのあなたの活動のための基本クラスを作ることができ、この基底クラスにあなたがONSTARTに受信機を登録することができますし、それを登録解除素敵tutorial

を持っていますonStop

+0

はい、BroadcastRecieverは、バックグラウンドプロセスからの良い考えではありません。 – W4R10CK

+0

@ W4R10CKなぜいいアイデアではないのですか? – jonathanrz

+0

BroadcastRecieverは、バックグラウンドプロセスがServiceの場合には実装することをお勧めします。スレッドに実装されていれば良い考えではありません。 – W4R10CK

関連する問題