2013-01-01 69 views
1

首先我希望我會尊重這個論壇的網絡禮儀,因爲這是我第一次使用它。從運行啓動的廣播接收器開始一個alertDialog活動

這是我的問題:我有具有以下結構的Android應用:

  1. 主要活動(顯示一些用戶指示和取決於SMS內容的一些警報對話框(參見2))
  2. SMS廣播接收器在啓動時運行(它工作正常,在啓動時運行,閱讀SMS並以正確的方式解析它們)。

我希望能夠在接收器獲得正確的SMS時激活Activity並顯示AlertDialog。 如果我第一次顯示Activity然後離開它(如果活動進入暫停狀態),Everythings正常工作,但如果我從不打開Activity,我只能顯示活動本身,但不能激活AlertDialog。

這裏是兩個碼小塊:

接收機(接收特定SMS時執行的代碼):

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

活性(在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方法接受的廣播消息並且因此仍然沒有註冊,因爲OnCreate在接收者發送內容時仍然沒有開始)。 但我不明白如何解決它,我認爲這是一個架構問題。 請注意,如果我啓動手機,並送2級的消息,出現這種情況:

  1. 手機上
  2. 一是短信
  3. 活動顯示了,沒有AlertDialog
  4. 最小化活動(或將其全屏幕,無所謂)
  5. 活動顯示了,與AlertDialog

任何幫助將不勝感激

祝你新年快樂。

回答

1

這不能爲你已經說明自己的工作的原因所在:

如果該活動尚未運行,則無法啓動,並立即 發送廣播意圖。目前您發送廣播意圖, 您的活動尚未開始,因此您的聽衆未註冊。

你應該只直接添加消息信息,您用來啓動活動的意圖,就像這樣:

//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

+0

非常感謝David,事實上,今晚我有同樣的想法,你提出,我終於設法讓代碼工作正常。 我希望我做了正確的事情,提出您的消息作爲解決方案,如果我錯過了什麼,讓我知道,這是我第一次使用stackoverflow – Giox79

+0

很高興你能解決問題,並歡迎來到StackOverflow!你做得很好。 –

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



} 
}