2012-03-13 9 views
1

ヘッドセットが接続されている場合は、警告を出したいですが、 "ACTION_HEADSET_PLUG"というインテントはフラグ "FLAG_RECEIVER_REGISTERED_ONLY"とともに使用されます。 私は意図を得るために常にサービスやアクティビティを実行しなければなりませんか?私はブロードキャスト受信者といいえのサービスやアクティビティを実行したいだけです。このための回避策はありますか?これも可能ですか?または、サービスを登録してから停止することはできますか?BroadcastReceiverのみを使用する場合、FLAG_RECEIVER_REGISTERED_ONLYの回避策はありますか?

P .:ヘッドセットが騒々しい意図で詰まっていることを知っています。

ありがとうございました。

答えて

4

Dianne Hackborn says

にのみregisterReceiverを呼び出した者に与えられ、そしてマニフェストで宣言さ 受信者に送信されていません。

だから、registerReceiverを呼び出すことが必要です。それは実行を停止し、受信者の登録を解除してもエラーが発生します。

0

あり、アプリケーションがインストールされている場合、登録されるべき成分(< 3.0)である、またはアプリケーションが例えばContentProviderように、開始(3.0 & ICS)に停止状態から移動した少なくともとき。

プロバイダは、明らかに、あなたが心配しなければならないライフサイクルの「終わり」(たくさん)はありません。

<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; 
    } 
} 

は、単にあなたのAndroidManifest.xml<provider>を追加し、置きます。

+0

ここでは、「マニフェストで宣言された受信者には送信されません」というメッセージが表示されます。 – zapl

+0

それは大変**間違っています**。受信者がマニフェストで宣言されていない場合は、の一部です。■onCreate - アプリケーションが停止状態から開始状態に移行したとき(または直ちにsdk_version <= 10の場合)にトリガーされます。 – Jens

+0

oops、true。しかし、誰かがコンテンツを要求するまで、ContentProviderは起動しません。私はあなたが 'Intent.ACTION_BOOT_COMPLETED'を捕まえ、' context.getContentResolver()。acquireContentProviderClient(Uri.parse( "content://your.authority")) 'を呼び出すことでそれが起こると思います。 – zapl

関連する問題