2017-01-07 57 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可能不是一個好主意。但後來,我給了一個想了想,如果你調用一個ServicecheckIsUpdated功能,並從它發送Broadcast,這可能是一個可行的解決方案。

所以基本上你需要一個BaseActivity類,並在您需要有一個BroadcastReceiver。您需要註冊onResume並再次取消註冊。

而且您還需要在Activity的每個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是落實,如果後臺進程是服務是個好主意,它不是如果線程執行一個好主意。 – W4R10CK

相關問題