[英]Is there a workaround for FLAG_RECEIVER_REGISTERED_ONLY, when using only a BroadcastReceiver?
I want to be alerted, if a headset is plugged in. But the Intent "ACTION_HEADSET_PLUG" is used with the Flag "FLAG_RECEIVER_REGISTERED_ONLY". 如果插入了耳机,我希望收到警报。但是Intent“ACTION_HEADSET_PLUG”与标志“FLAG_RECEIVER_REGISTERED_ONLY”一起使用。 So I have to run a service or a activity all the time to get the intent?
所以我必须一直运行服务或活动才能获得意图? I just want to run a Broadcastreceiver and NO service or activity at all.
我只是想运行Broadcastreceiver而且根本没有服务或活动。 Is there a workaround for this?
这有解决方法吗? Is this even possible?
这甚至可能吗? Or can I start a service once, registering and then stopping it?
或者我可以启动一次服务,注册然后停止它吗?
PS: I know when the headset is plugged off with the becoming noisy intent. PS:我知道当耳机插入时会变得嘈杂。
Thank you for you answers. 谢谢你的答案。
Dianne Hackborn says Dianne Hackborn说
It's only given to those who call registerReceiver, and not sent to receivers declared in manifests.
它仅发给那些调用registerReceiver的人,而不是发送给清单中声明的接收者。
So you have to have something running that calls registerReceiver
. 所以你必须运行一些调用
registerReceiver
东西。 It that stops running and you don't unregister the receiver you get an error. 它停止运行,你没有注销接收器,你得到一个错误。
There are components that should be registered when the application is installed (<3.0), or at least when the application has moved from stopped state to started (3.0 & ICS), such as a
ContentProvider
. 安装应用程序时应该注册的组件(<3.0),或者至少在应用程序从停止状态移动到启动(3.0和ICS)时,例如
ContentProvider
。
The provider apparently doesn't have an "end" to it's life cycle that you have to worry (a lot) about. 提供商显然没有“终结”它的生命周期,你必须担心(很多)。
Simply put, adding a <provider>
to your AndroidManifest.xml
: 简而言之,在您的
AndroidManifest.xml
添加<provider>
:
<provider android:name=".ReceiverProvider"
android:authorities="some.provider.authority.goes.here"
android:exported="true" />
And, for the ReceiverProvider
: 而且,对于
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;
}
}
Worth trying perhaps. 也许值得尝试。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.