【问题标题】:How to show dialog that is started from a background activity如何显示从后台活动启动的对话框
【发布时间】:2014-02-16 07:54:50
【问题描述】:

我的应用程序在后台,我使用了一个在满足特定条件时发送广播的服务:

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);

我尝试使用以对话框为主题的活动而不是对话框,但它使活动成为焦点(我只需要对话框)。由于我需要在锁定屏幕上显示,我在对话框中添加了一些标志,以及以下权限:

 <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 上测试过。

我应该设置什么让我的对话框可见?

【问题讨论】:

  • 我不认为您可以从后台应用程序显示对话框,因为它无法访问主线程,因此不会影响 UI。有一些小部件允许在 iOS 等锁定屏幕上显示背景通知。您应该使用 google 并查看这些内容。

标签: android android-dialog


【解决方案1】:

根据您的回答和一些搜索,我得到了这个结果(可能不符合 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

调用它的 show
super.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);

通过这些步骤,您可以创建一个看似与主应用程序分离并单独显示的对话框。

【讨论】:

    【解决方案2】:

    问题是你不能在没有任何用户界面的情况下显示警报对话框,快速的解决方案是在你的应用程序在 onResume() 或作为通知时显示它,查看that 了解更多信息.

    【讨论】:

    • 我不明白。某些消息传递应用程序即使在锁定屏幕上也会显示对话框(如 V***r)。他们怎么能这样做?
    • 在我上次更新的链接中你可以找到很多信息,你可以用对话框主题开始活动我认为 V 使用类似的东西:developer.android.com/guide/topics/ui/themes.html#ApplyATheme
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-21
    • 2013-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多