2015-12-03 35 views
1

我有一個IntentService用於通過SmsManager異步發送文本消息給人。我面臨的問題是,我註冊的服務是在完成這兩項操作中的任何一項時,發送/發送接收器以偵聽。這裏是我的代碼:IntentService + SmsManager沒有得到onReceive調用registeredReceivers

public static final String SENT = "SMS_SENT"; 
private int mPartCounter; 

public SendTextService(String name){ 
    super(name); 
} 

public SendTextService(){ 
    super(SendTextService.class.getSimpleName()); 
} 

@Override 
protected void onHandleIntent(Intent intent) { 
    mMessage = intent.getStringExtra(MESSAGE_CONTENT); 
    mNumbers = intent.getStringArrayExtra(MESSAGE_CONTACTS); 
    registerReceivers(); 
    sendMessage(); 
} 

private void sendMessage(String message, String number){ 
    SmsManager smsManager = SmsManager.getDefault(); 
    ArrayList<String> splitMessage = smsManager.divideMessage(message); 
    mPartCounter = splitMessage.size(); 

    /* Handle multipart messages */ 
    ArrayList<PendingIntent> sendIntents = new ArrayList<>(); 
    ArrayList<PendingIntent> deliverIntents = new ArrayList<>(); 
    PendingIntent sendIntent = PendingIntent.getBroadcast(this, 0, new Intent("SMS_SENT"), 0); 
    PendingIntent deliverIntent = PendingIntent.getBroadcast(this, 0, new Intent("SMS_DELIVERED"), 0); 

    /* Add a PendingIntent for send/deliver for each part needed */ 
    for(int i=0; i<mPartCounter; ++i) { 
     sendIntents.add(sendIntent); 
     deliverIntents.add(deliverIntent); 
    } 

    /* Send the messages in either multi-parts or single */ 
    smsManager.sendTextMessage(number, null, message, sendIntent, deliverIntent); 
} 

private void registerReceivers(){ 
    registerReceiver(new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context arg0, Intent arg1) { 
      switch (getResultCode()) { 
       case Activity.RESULT_OK: 
        Toast.makeText(getBaseContext(), "SMS sent", Toast.LENGTH_SHORT).show(); 
        break; 

       default: 
        Toast.makeText(getBaseContext(), "SMS sending failed", Toast.LENGTH_SHORT).show(); 
        break; 
      } 
     } 
    }, new IntentFilter(SENT)); 
} 

我設置了斷點,代碼永遠不會在這裏,但消息確實發送?任何人都看到了問題?

哦一切,我通過我自己的接收開始我的服務:

static public class MessageReceiver extends BroadcastReceiver{ 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Intent textService = new Intent(context, SendTextService.class); 
     textService.putExtra(MESSAGE_CONTENT, intent.getStringExtra(MESSAGE_CONTENT)); 
     textService.putExtra(MESSAGE_CONTACTS, intent.getStringArrayExtra(MESSAGE_CONTACTS)); 
     context.startService(textService); 
    } 
} 

而且在我的AndroidManifest.xml中都定義:

<service android:name=".service.SendTextService"/> 
<receiver android:name=".service.SendTextService$MessageReceiver"/> 

這是我打電話給我的接收器:

Intent broadcastIntent = new Intent(SendActivity.this, SendTextService.MessageReceiver.class); 
broadcastIntent.putExtra(SendTextService.MESSAGE_CONTACTS, mNumbers); 
broadcastIntent.putExtra(SendTextService.MESSAGE_CONTENT, mBodyEdit.getText().toString()); 
sendBroadcast(broadcastIntent); 

Logcat有這個輸出,但這是因爲我試圖取消註冊他們,當我看到他們都是森的...但檢測發生在接收器用於處理SNET消息(這就是爲什麼我有這個問題了):

12-02 22:55:36.238 6268-6268/org.thorrism.masstexter E/ActivityThread: Service org.thorrism.masstexter.service.SendTextService has leaked IntentReceiver [email protected] that was originally registered here. Are you missing a call to unregisterReceiver()? 
12-02 22:55:36.238 6268-6268/org.thorrism.masstexter E/ActivityThread: android.app.IntentReceiverLeaked: Service org.thorrism.masstexter.service.SendTextService has leaked IntentReceiver [email protected] that was originally registered here. Are you missing a call to unregisterReceiver()? 
12-02 22:55:36.238 6268-6268/org.thorrism.masstexter E/ActivityThread:  at android.app.LoadedApk$ReceiverDispatcher.<init>(LoadedApk.java:1009) 
12-02 22:55:36.238 6268-6268/org.thorrism.masstexter E/ActivityThread:  at android.app.LoadedApk.getReceiverDispatcher(LoadedApk.java:810) 
12-02 22:55:36.238 6268-6268/org.thorrism.masstexter E/ActivityThread:  at android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:2068) 
12-02 22:55:36.238 6268-6268/org.thorrism.masstexter E/ActivityThread:  at android.app.ContextImpl.registerReceiver(ContextImpl.java:2048) 
12-02 22:55:36.238 6268-6268/org.thorrism.masstexter E/ActivityThread:  at android.app.ContextImpl.registerReceiver(ContextImpl.java:2042) 
12-02 22:55:36.238 6268-6268/org.thorrism.masstexter E/ActivityThread:  at org.thorrism.masstexter.service.SendTextService.registerReceivers(SendTextService.java:135) 
12-02 22:55:36.238 6268-6268/org.thorrism.masstexter E/ActivityThread:  at org.thorrism.masstexter.service.SendTextService.startSendMessages(SendTextService.java:66) 
12-02 22:55:36.238 6268-6268/org.thorrism.masstexter E/ActivityThread:  at org.thorrism.masstexter.service.SendTextService.onHandleIntent(SendTextService.java:51) 
+0

清單中的權限?登錄貓的任何​​錯誤? –

+0

你太快了...是的權限日誌貓確實有一些東西,但沒有關係..我認爲 – rosenthal

+0

我已更新與logcat輸出和權限 – rosenthal

回答

2

IntentService小號幾乎只要onHandleIntent()方法結束自行停止。您正在收到關於泄露的Receiver的日誌消息,因爲您尚未在發生此事件之前取消註冊Receiver,因爲您使用的是匿名Receiver實例,所以您無法真正對代碼執行此操作。

如果要動態註冊Receiver,則需要在組件中這樣做,該組件將一直運行,直到發送廣播;例如在Activity或常規的Service中。

您也可以靜態地註冊在清單中的接收器,因爲你已經與MessageReceiver完成,將開始在廣播火災,無論您IntentService運行與否,而是你需要指定一個<intent-filter>它在清單中,如果您使用隱式Intent。例如:

<receiver android:name=".service.SendTextService$SentReceiver"> 
    <intent-filter> 
     <action android:name="SMS_SENT" /> 
    </intent-filter> 
</receiver> 

否則,你可以使用一個明確的Intent - 一個指定的接收器類 - 和省略過濾器。這可能是首選方法,因爲其他應用程序的Receiver沒有機會獲得廣播。如果您在清單中靜態註冊Receiver,則不需要動態註冊它。

此外,您不需要向接收方廣播以啓動您的IntentService。您可以直接啓動服務,並附帶Intent所需的附加服務。也就是說,你的MessageReceiver並不是真的有必要。

+0

謝謝邁克。你的建議非常有意義,我能夠做到。我也刪除了Recieever,但現在我使用一個通過服務與活動進行通信。我在活動恢復時動態註冊廣播接收器,並在活動暫停時取消註冊。接收方使我知道所有消息何時發送,因爲我的服務通過intent過濾器註冊到我的活動中註冊的接收方 – rosenthal

相關問題