android,如何从某些非 ui 模块弹出对话框

android, how to pop a dialog from some non ui module

如果显示的内容可能与 activity 不同,如何从非 ui 模块打开对话框?

假设可以堆叠多个活动,Activity_A、Activity_B、Activity_C。公共服务模块可能 运行 在非 ui 线程和 运行 以防需要弹出对话框。

这可以通过将处理程序从所有活动活动传递到模块和 post 消息来让 activity 弹出对话框来完成。

但这需要一些管理来传递处理程序并确定谁在视图之上。

有没有更好的方法?

您可以使用 BroadcastReceiver

从非 ui 线程显示 dailog

了解流程:

public class Sample extends Activity {

    BroadcastReceiver updateUIReciver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);


        updateUIReciver = new BroadcastReceiver() {

            @Override
            public void onReceive(Context context, Intent intent) {
                //UI update here
                ShowFailedDailog(null, getString(R.string.mms_sending_service_failed_txt));
            }
        };
        IntentFilter filter = new IntentFilter();
        filter.addAction("update.from.nonui");
        registerReceiver(updateUIReciver, filter);
    }

    void ShowFailedDailog(String title, String message) {
        final Dialog dialog = new Dialog(context);
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        dialog.setContentView(R.layout.import_backup_popup);

        TextView Save = (TextView) dialog.findViewById(R.id.tOk);
        Save.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dialog.dismiss();
            }
        });
        TextView cancel = (TextView) dialog.findViewById(R.id.tCancel);
        cancel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dialog.dismiss();
            }
        });
        dialog.show();
    }
}

非 UI:

public class NonUiSerive extends Service {
     Context context;

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        if (intent != null) {

            // ..... your tasks

            if (SomeFlagUpdateTrue) {
                Intent local = new Intent();
                local.setAction("mms.seding.failed");
                context.sendBroadcast(local);
            }
        }
        this.stopSelf();
        return 0;
    }

}

类似地注册所有三个接收器 class 它会在每个 activity 更新一次,不限于一个。

试用后我觉得最简单的就是用application context打开一个activity for dialog。这样它就不会关心谁是当前的 activity 了。

Intent dialogIntent = new Intent(applicationCotext, DialogActivity.class);
    dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    applicationCotext.startActivity(dialogIntent);