2012-03-13 97 views
1

如果插入了耳機,我希望收到警報。但Intent「ACTION_HEADSET_PLUG」與Flag「FLAG_RECEIVER_REGISTERED_ONLY」一起使用。 因此,我必須始終運行一項服務或一項活動才能獲得意圖?我只想運行Broadcastreceiver和NO服務或活動。有沒有解決方法?這甚至有可能嗎?或者我可以開始一次服務,註冊並停止它?當僅使用BroadcastReceiver時,是否有FLAG_RECEIVER_REGISTERED_ONLY的解決方法?

P.S .:我知道什麼時候頭戴式耳機會變得嘈雜的意圖。

謝謝你的回答。

回答

4

Dianne Hackborn says

這只是給那些誰打電話registerReceiver,而不是發送到艙單申報 接收器。

所以你必須有東西運行,呼籲registerReceiver。它停止運行,你不註銷接收器,你會得到一個錯誤。

0

有些情況下,應用程序被安裝(< 3.0)應該被註冊的組件,或至少當應用程序有從停止狀態移動到開始(3.0 & ICS),諸如ContentProvider

提供者顯然沒有一個「結束」它的生命週期,你必須擔心(很多)。

簡單地說,加入<provider>AndroidManifest.xml

<provider android:name=".ReceiverProvider" 
    android:authorities="some.provider.authority.goes.here" 
    android:exported="true" /> 

而且,對於ReceiverProvider

public class ReceiverProvider extends ContentProvider { 
    @Override 
    public boolean onCreate() { 
     BroadcastReceiver receiver = new BroadcastReceiver() { 
      @Override 
      public void onReceive(Context context, Intent intent) { 
       System.out.println("Headset plug: " + intent); 
      } 
     }; 
     IntentFilter filter = new IntentFilter(Intent.ACTION_HEADSET_PLUG); 
     getContext().registerReceiver(receiver, filter); 
     return true; 
    } 

    @Override 
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, 
      String sortOrder) { 
     return null; 
    } 

    @Override 
    public String getType(Uri uri) { 
     return null; 
    } 

    @Override 
    public Uri insert(Uri uri, ContentValues values) { 
     return null; 
    } 

    @Override 
    public int delete(Uri uri, String selection, String[] selectionArgs) { 
     return 0; 
    } 

    @Override 
    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { 
     return 0; 
    } 
} 

值得一試可能。

+0

在這裏你有「沒有發送到清單中聲明的​​接收者」的情況 – zapl 2012-03-13 18:36:07

+0

這嚴重**不正確**。接收器沒有在清單中聲明,它是的一部分:■onCreate - 當應用程序從停止狀態變爲啓動狀態(或立即如果sdk_version <= 10)時觸發。 – Jens 2012-03-14 07:46:22

+0

oops,是。但是,只有在有人向你請求內容之前,ContentProvider纔會啓動。我想你可以抓住'Intent.ACTION_BOOT_COMPLETED',然後調用'context.getContentResolver()。acquireContentProviderClient(Uri.parse(「content://your.authority」))'來實現這一點。 – zapl 2012-03-14 10:01:30

相關問題