首先,我希望我会尊重这个论坛的网络礼节,因为这是我第一次使用它。
这是我的问题:我有一个具有以下结构的Android应用程序:
我希望能够在接收者获得正确的短信时激活活动并显示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条消息,则会发生这种情况:
任何帮助将不胜感激
祝你新年快乐。
答案 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();
}
}