2010-09-20 70 views
1

我開始學習android開發,所以我的知識目前非常有限。 我想玩廣播,但我卡住了,我不明白我做錯了什麼。 我試圖做的只是從廣播接收器中演示一個簡單的Toast。Intent&BroadcastReceiver

的意圖是在清單中定義一個定製的意圖:

<receiver android:name=".receiver.SendReceiver" android:enabled="true"> 
    <intent-filter> 
    <action android:name="com.android.terralink.sem.SOCCIA"></action> 
    </intent-filter> 
</receiver> 

接收器的定義是這樣的:

public class SearchReceiver extends BroadcastReceiver { 
    public void onReceive(Context context, Intent intent){ 
    Toast.makeText(context, "asasa", Toast.LENGTH_SHORT).show(); 
    } 
} 

在第一時間行動,從我做這個應用程序調用:

Intent i2 = new Intent(this, SearchReceiver.class); 
i2.setAction(CUSTOM_INTENT); 
sendBroadcast(i2); 

我檢查Toast代碼在活動中工作,但不在廣播中。 這是因爲Toast不能在接收方環境中顯示?

另外,有關android應用程序結構的更多問題。 如果來自我的Activty,我允許用戶在文本框中插入一個字符串並提交(按鈕綁定),並且我希望應用程序在後臺執行搜索並在結果準備就緒時通知用戶,請執行以下操作? 1)搜索框 2)啓動在獲取數據服務主要活動,發送廣播 3)接收器notofy用戶,並打開顯示結果

是否有意義做這樣的事情的活動? 或者通知應該在服務完成之前由服務自己完成?

謝謝

回答

2

我發現當我註冊接收器時,問題出現在清單中。 其實可以在接收器中顯示Toast而不會有任何問題。 乾杯

0

您不能在廣播接收器中顯示Toast。 一旦onReceive()調用完成(目前只允許最多10秒),Android通常會關閉您的進程。由於吐司是異步顯示的,我認爲它的上下文在它被顯示之前就被殺死了。

作爲Toa​​st的替代方案,您可以看看RemoveViews的概念,以便在接收器的另一個進程中更新UI。或者,啓動一個顯示敬酒並立即關閉的活動。

對於你的問題#2,我建議你保持活動運行的點擊,並開始對搜索,因爲他們進來,這將更新搜索結果中的AsyncTask後的搜索按鈕。

+0

是有道理的,我應該發生的事情,只是沒有100%的把握。多謝 – CLod 2010-09-21 03:43:27

0

要從我們可以使用下面的代碼的廣播接收器顯示舉杯:

public class ServiceReceiver extends BroadcastReceiver { 

    Context context; 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     this.context = context; 
     MyPhoneStateListener phoneListener = new MyPhoneStateListener(); 
     TelephonyManager telephony = (TelephonyManager) context 
       .getSystemService(Context.TELEPHONY_SERVICE); 
     telephony.listen(phoneListener, PhoneStateListener.LISTEN_CALL_STATE); 
    } 

    private class MyPhoneStateListener extends PhoneStateListener { 

     @Override 
     public void onCallStateChanged(int state, String incomingNumber) { 
      super.onCallStateChanged(state, incomingNumber); 
      switch (state) { 
      case TelephonyManager.CALL_STATE_IDLE: 
       Toast.makeText(context, "Idle call", Toast.LENGTH_LONG).show(); 
       Log.d("***************************DEBUG", "IDLE"); 
       break; 
      case TelephonyManager.CALL_STATE_OFFHOOK: 
       Log.d("***************************DEBUG", "OFFHOOK"); 
       break; 
      case TelephonyManager.CALL_STATE_RINGING: 
       Toast.makeText(context, "Ringing call", Toast.LENGTH_LONG) 
         .show(); 
       Log.d("***************************DEBUG", "RINGING"); 
       break; 
      } 
     } 
    } 
}