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);
如果显示的内容可能与 activity 不同,如何从非 ui 模块打开对话框?
假设可以堆叠多个活动,Activity_A、Activity_B、Activity_C。公共服务模块可能 运行 在非 ui 线程和 运行 以防需要弹出对话框。
这可以通过将处理程序从所有活动活动传递到模块和 post 消息来让 activity 弹出对话框来完成。
但这需要一些管理来传递处理程序并确定谁在视图之上。
有没有更好的方法?
您可以使用 BroadcastReceiver
了解流程:
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);