使用来自运行启动的广播接收器的alertDialog启动活动

时间:2013-01-01 16:04:06

标签: android android-intent

首先,我希望我会尊重这个论坛的网络礼节,因为这是我第一次使用它。

这是我的问题:我有一个具有以下结构的Android应用程序:

  1. 主要活动 (根据短信内容显示一些用户指示和一些提示对话框(见2))
  2. 启动时运行的
  3. 短信广播接收器 (工作正常,启动时运行,阅读短信并以正确的方式解析)。
  4. 我希望能够在接收者获得正确的短信时激活活动并显示AlertDialog。 如果我第一次显示活动然后离开它(如果活动进入暂停状态),则Everythings工作正常,但如果我从未打开活动,我只能显示活动本身但不能激活AlertDialog。 / p>

    这是两段代码:

    接收方(接收特定短信时执行的代码):

    //Show/start activity
    Intent sec=new Intent(context, SecureMessagesActivity.class);
    sec.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
    context.startActivity(sec);
    // Activate AlertDialog
    Intent i = new Intent(context.getString(R.string.intentReceivedSuccessSms)).putExtra("some_msg", "I will be sent!");
    context.sendBroadcast(i);
    Log.v(TAG, "Sent Intent intentReceivedSuccessSms");
    

    Activity(在android清单中定义为singleTop):

    public void onCreate(Bundle savedInstanceState) 
    {
        Log.v(TAG, "Performing onCreate");
    
        super.onCreate(savedInstanceState);
    
        setTheme( android.R.style.Theme_Light);
        setContentView(R.layout.main);
    
        //--------------------------------------------------------------
        // Manage subscription to intent
        //--------------------------------------------------------------
        IntentFilter intentFilter = new IntentFilter(
                getString(R.string.intentReceivedSuccessSms));
        mReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(final Context context, Intent intent) {
                    AlertDialog.Builder ad = new AlertDialog.Builder(context);
                    ad.setTitle(getString(R.string.youFoundIt));
                    ad.setMessage(getString(R.string.stopTheMusic));
                    ad.setIcon(R.drawable.tick);
                    ad.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                       public void onClick(DialogInterface dialog, int which) {                             
                                Log.v(TAG, "Received button pressure to stop ringtone");
                           };
                       }
                );
                ad.show();
            }
    
        };
        //registering our receiver
        this.registerReceiver(mReceiver, intentFilter);
        //--------------------------------------------------------------
        // End of manage subscription to intent
        //--------------------------------------------------------------
    }
    

    我认为我的问题与以下事实相关:当应用程序尚未激活时,只有广播接收器处于活动状态,因此我从不运行活动的OnCreate方法。通过这种方式,我认为首先启动活动(参见评论“显示/开始活动”)并且在发送OnCreate方法接受的广播消息之后立即(因此仍未注册,因为当接收者发送Intents时,OnCreate仍未启动。 但我不明白如何解决它,我认为这是一个架构问题。 请注意,如果我启动手机并发送2条消息,则会发生这种情况:

    1. 电话开启
    2. 第一条短信
    3. 活动显示,没有AlertDialog
    4. 最大限度地减少活动(或将其全屏显示,无关紧要)
    5. 使用AlertDialog
    6. 显示活动

      任何帮助将不胜感激

      祝你新年快乐。

2 个答案:

答案 0 :(得分:1)

由于您已经解释过原因,这不起作用:

  

如果活动尚未运行,则无法立即启动   发送广播意图。在您发送广播意图的那一刻,   您的活动尚未开始,因此您的听众未注册。

您应该直接将消息信息添加到用于启动活动的Intent中,如下所示:

//Show/start activity
Intent sec=new Intent(context, SecureMessagesActivity.class);
sec.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
sec.putExtra("some_msg", "I will be sent!");
context.startActivity(sec);
Log.v(TAG, "Sent Intent intentReceivedSuccessSms");

然后,在onCreate()onNewIntent()中,您可以获得额外信息并使用它来显示您的对话框。您的活动中不需要BroadcastReceiver

答案 1 :(得分:0)

Intent sec=new Intent(context, Dialog.class);
            sec.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
            context.startActivity(sec);

你需要在活动中使用它!

public class Dialog extends Activity 
{

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


    this.getWindow()
    .setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);

    AlertDialog.Builder builder = new AlertDialog.Builder(this);

    builder
        .setTitle("Califica la llamada")
        .setMessage("Esto ayudará a brindarte un mejor servicio de telefonía!")

        .setCancelable(true)
        .setPositiveButton("Buena", new DialogInterface.OnClickListener() 
        {
            public void onClick(DialogInterface dialog, int id) 
            {
                dialog.cancel();
                finish();
            }
        })
        .setNegativeButton("Mala", new DialogInterface.OnClickListener() 
        {
            public void onClick(DialogInterface dialog, int id) 
            {
                dialog.cancel();
                finish();
            }
        });


    AlertDialog alert = builder.create();
    alert.show();



}
}