2011-03-13 143 views
45

我正在監視傳入的SMS。Android BroadcastReceiver啓動時 - 活動在後臺時保持運行

我的應用程序與BroadcastReceiver完美配合。然而,它正在從一個Activity開始工作,並希望保持BroadcastReceiver始終運行(而不僅僅是當我的Activity正在運行時)。

我該如何做到這一點?我查看了BroadcastReceiver的生命週期,但文檔中提到的所有內容都是生命週期僅限於onReceive方法,而不是保持BroadcastReceiver檢查傳入SMS的生命週期。

我該如何讓這種持久性?

感謝

回答

132

您需要在清單定義接收機與動作名稱android.intent.action.BOOT_COMPLETED

<!-- Start the Service if applicable on boot --> 
<receiver android:name="com.prac.test.ServiceStarter"> 
    <intent-filter> 
     <action android:name="android.intent.action.BOOT_COMPLETED"/> 
    </intent-filter> 
</receiver> 

確保還要包含完整的引導權限。

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> 

使用Service爲此可以使任何東西保持不變。並使用接收器接收啓動事件重新啓動服務,如果系統啓動..

開機啓動服務的代碼。使服務做你的工作檢查短信或任何你想要的。你需要在MyPersistingService中做你的工作來定義你的自我。

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.util.Log; 

public class ServiceStarter extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Intent i = new Intent("com.prac.test.MyPersistingService"); 
     i.setClass(context, MyPersistingService.class); 
     context.startService(i); 
    } 
} 
+10

您可能還想確保在應用程序清單文件中定義了「RECEIVE_BOOT_COMPLETED」權限,以使其可以正常工作。 – 2012-05-27 18:01:18

+0

如果應用程序上下文從項目庫中擴展另一個,這是否工作? – Maxrunner 2012-08-23 18:00:45

+0

感謝Javanator(Rohit),它對我的​​幫助(Ravi-CIPL&馬來西亞) – DynamicMind 2013-07-22 07:30:08

5

服務或結束啓動是不是強制性的

其實,你並不需要實現一個Service或註冊android.intent.action.BOOT_COMPLETED

一些例子說明如何註冊/註銷BroadcastReceiver當活動被創建和銷燬時。但是,這對於只在打開應用程序時纔會使用的意圖很有用(例如,用於Service/Activity之間的內部通信)。

但是,如果是短信,您希望始終聽取意圖(而不是僅在您打開應用程序時)。

還有另外一種方式

您可以創建一個class延伸BroadcastReceiver,並通過AndroidManifest.xml註冊所需的意圖。這樣,BroadcastReceiver將獨立於您的活動(並且不會取決於活動的生命週期)

這樣,即使您的應用已關閉,短信到達後您的BroadcastReceiver也會自動通知您。

AndroidManifest。XML

<?xml version="1.0" encoding="utf-8"?> 
<manifest> 
    ... 
    <uses-permission android:name="android.permission.READ_SMS"/> 
    <uses-permission android:name="android.permission.RECEIVE_SMS"/> 

    <application> 
     .... 
     <receiver android:name=".MyCustomBroadcastReceiver"> 
      <intent-filter> 
       <action android:name="android.provider.Telephony.SMS_RECEIVED" /> 
      </intent-filter> 
     </receiver> 
    </application> 
</manifest> 

MyCustomBroadcastReceiver.java

public class MyCustomBroadcastReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     if(intent != null) { 
      String action = intent.getAction(); 
      if(action != null) { 
       if(action.equals("android.provider.Telephony.SMS_RECEIVED")) { 
        // DO YOUR STUFF 
       } else if (action.equals("ANOTHER ACTION")) { 
        // DO ANOTHER STUFF 
       } 
      } 
     } 
    } 
} 

注意

您可以添加其他意向過濾器AndroidManifest和處理所有的人在同一BroadcastReceiver

僅當您執行長期任務時才啓動服務。您只需顯示通知或更新某個數據庫,只需使用上面的代碼即可。

+0

如果應用程序崩潰太頻繁或用戶強制停止應用程序,它將不會在廣播事件中重新啓動 – basin 2017-11-22 14:43:40