2012-03-13 98 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

相关问题