2017-01-07 29 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

相关问题