我的应用程序在后台,我使用的服务在满足特定条件时发送广播:
if(send)
{
Intent intent = new Intent(Tags.MSG_BROADCAST_ID);
intent.putExtra(Tags.MESSAGE, msg);
Log.w(Tags.DEBUG,"Broadcast");
sendBroadcast(intent);
}
}
我的广播接收器获得广播,它应该显示一个警告对话框。我用这个:
public void onReceive(Context context, Intent intent)
{
Bundle bundle = intent.getExtras();
if (bundle != null && Globals.MainActivity != null)
{
msg = bundle.getString(Tags.MESSAGE);
Globals.MainActivity.ShowMessage(msg);
}
}
当我的主要活动位于前台时,警报会正确显示。当它在后台时,什么都看不见。
Runnable runnable = new Runnable()
{
public void run()
{
KeyguardManager km = (KeyguardManager) getSystemService(KEYGUARD_SERVICE);
final KeyguardManager.KeyguardLock kl = km.newKeyguardLock("My_App");
kl.disableKeyguard();
PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE);
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.FULL_WAKE_LOCK, "My_App");
wl.acquire();
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
MainActivity.this);
// set title
alertDialogBuilder.setTitle("Your Title");
// set dialog message
alertDialogBuilder
.setMessage("Click yes to exit!")
.setCancelable(false)
.setPositiveButton("Yes",new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,int id) {
// if this button is clicked, close
// current activity
dialog.dismiss();
}
}
);
// create alert dialog
AlertDialog alertDialog = alertDialogBuilder.create();
alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
alertDialog.getWindow().setType(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
// show it
alertDialog.show();
wl.release();
}
};
runOnUiThread(runnable);
我尝试使用Dialog主题活动而不是对话框,但它会使活动聚焦(我只需要对话框)。由于我需要在锁定的屏幕上显示,我在对话框中添加了一些标志,以及以下权限:
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
我在Android 2.3.6上测试过它。
我应该设置什么才能使对话框可见?
答案 0 :(得分:5)
根据您的回答和一些搜索,我得到了这个结果(可能不符合Google UI指南):
创建代表警报的活动
public class DialogMessageActivity extends Activity
在 AndroidManifest.xml
中将其主题设置为 Theme.Translucent android:theme="@android:style/Theme.Translucent"
在 onCreate 中删除 setContentView 函数
super.onCreate(savedInstanceState);
//setContentView(R.layout.dialog_message);
添加AlertDialog并从 onCreate
调用 showsuper.onCreate(savedInstanceState);
//setContentView(R.layout.dialog_message);
displayAlert(msg);
private void displayAlert(String msg)
{
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage(msg).setCancelable(
false).setPositiveButton("OK",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
finish();
}
});
AlertDialog alert = builder.create();
alert.show();
}
从任何其他活动(前景或背景活动,无论如何)调用它时,请使用以下标志:
Intent intent=new Intent(this,DialogMessageActivity.class);
intent.putExtra(Tags.MESSAGE,msg);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
通过这些步骤,您可以创建一个看似与主应用程序分离并单独显示的对话框。
答案 1 :(得分:1)
问题是您无法显示没有任何用户界面的警告对话,快速解决方案是在您的应用程序在onResume()中作为通知返回时显示它,或检查that更多。