无法在启动时动态注册接收器。我没有活动。而且我不想在服务中注册它。
引导接收器,我注册另一个接收器:
package zzz.zzz.zzz;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
public class AutoStart extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
if ((intent.getAction() != null) && (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")))
{
IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
filter.addAction(Intent.ACTION_SCREEN_OFF);
BroadcastReceiver mReceiver = new ScreenReceiver();
context.registerReceiver(mReceiver, filter);
}
}
}
我想注册的接收者:
package zzz.zzz.zzz;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class ScreenReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF))
{
// some code
}
if (intent.getAction().equals(Intent.ACTION_SCREEN_ON))
{
// some code
}
}
}
logcat的:
10-12 15:03:45.849: ERROR/AndroidRuntime(240): Uncaught handler: thread Thread-8 exiting due to uncaught exception
10-12 15:03:45.859: ERROR/AndroidRuntime(240): android.content.ReceiverCallNotAllowedException: IntentReceiver components are not allowed to register to receive intents
10-12 15:03:45.859: ERROR/AndroidRuntime(240): at android.app.ReceiverRestrictedContext.registerReceiver(ApplicationContext.java:126)
10-12 15:03:45.859: ERROR/AndroidRuntime(240): at android.app.ReceiverRestrictedContext.registerReceiver(ApplicationContext.java:120)
10-12 15:03:45.859: ERROR/AndroidRuntime(240): at zzz.zzz.zzz.RegisterReceiver$1.run(RegisterReceiver.java:18)
10-12 15:03:46.159: ERROR/ContactsProvider(98): Cannot determine the default account for contacts compatibility
10-12 15:03:46.159: ERROR/ContactsProvider(98): android.accounts.AuthenticatorException: bind failure
10-12 15:03:46.159: ERROR/ContactsProvider(98): at android.accounts.AccountManager.convertErrorToException(AccountManager.java:1096)
10-12 15:03:46.159: ERROR/ContactsProvider(98): at android.accounts.AccountManager.access$500(AccountManager.java:74)
10-12 15:03:46.159: ERROR/ContactsProvider(98): at android.accounts.AccountManager$BaseFutureTask$Response.onError(AccountManager.java:1003)
10-12 15:03:46.159: ERROR/ContactsProvider(98): at android.accounts.IAccountManagerResponse$Stub.onTransact(IAccountManagerResponse.java:69)
10-12 15:03:46.159: ERROR/ContactsProvider(98): at android.os.Binder.execTransact(Binder.java:287)
10-12 15:03:46.159: ERROR/ContactsProvider(98): at dalvik.system.NativeStart.run(Native Method)
10-12 15:03:46.879: ERROR/MediaPlayerService(31): Couldn't open fd for content://settings/system/notification_sound
10-12 15:03:46.889: ERROR/MediaPlayer(52): Unable to to create media player
答案 0 :(得分:13)
答案在错误消息中:IntentReceiver components are not allowed to register to receive intents
。您无法在现有的BroadcastReceiver中注册新的BroadcastReceiver。
答案 1 :(得分:5)
我已在ACTION_BOOT_COMPLETED
中启动了该服务
@Override
public void onReceive(Context context, Intent intent) {
Log.d("BootReceiver", "onReceive() intent: " + intent.getAction());
if (intent.getAction() != null) {
// Boot completed
if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
if(!isMyServiceRunning(context)){
startTheService(context);
}
}
将在幕后创建我的应用程序:
public class MyApplication extends Application
在那里我覆盖了onCreate:
@Override
public void onCreate() {
super.onCreate();
Log.d("MyApplication", "registering for screen states");
registerClassBecauseManifestIsNotEnough(getApplicationContext()) ;
}
private void registerClassBecauseManifestIsNotEnough(Context context) {
IntentFilter intentFilter = new IntentFilter(Intent.ACTION_SCREEN_ON);
intentFilter.addAction(Intent.ACTION_SCREEN_OFF);
BroadcastReceiver mReceiver = new ScreenStateBroadcastReceiver();
context.registerReceiver(mReceiver, intentFilter);
}
问题至少解决了我。
答案 2 :(得分:1)
你不能在清单中注册吗?
答案 3 :(得分:1)
对于小部件需要一个解决方案。以下是我的解决方法:
private static boolean isRegisteredFromCode = false;
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
for (int i = 0; i < appWidgetIds.length; ++i) {
RemoteViews layout = buildLayout(context, appWidgetIds[i]);
appWidgetManager.updateAppWidget(appWidgetIds[i], layout);
}
super.onUpdate(context, appWidgetManager, appWidgetIds);
if(!isRegisteredFromCode){
isRegisteredFromCode = true;
context.getApplicationContext().registerReceiver(this, new IntentFilter(Intent.ACTION_SCREEN_OFF));
context.getApplicationContext().registerReceiver(this, new IntentFilter(Intent.ACTION_SCREEN_ON));
}
}
小工具是BroadcastReceiver
...
答案 4 :(得分:0)
一个非常简单的解决方案是在一个单独的线程中启动新服务:
public class BootServiceReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// Launcher is a Singleton.
// Note that you pass it context.getApplicationContext() as parameter
final Launcher launcher=Launcher.get(context.getApplicationContext());
new Thread(new Runnable() {
@Override
public void run() {
launcher.doActions();
}
}).start();
}
}
在Launcher中我们有:
public class Launcher {
private static Launcher instance;
private Context ctx;
private BroadcastReceiver receiver1, receiver2;
private Launcher(Context ctx) {
this.ctx=ctx;
}
public static Launcher get(Context ctx) {
if (yo==null)
yo=new Launcher(ctx);
return yo;
}
public void doActions() {
receiver1=new Receiver1();
IntentFilter filter1=new IntentFilter(Service1.MY_ACTION);
ctx.registerReceiver(receiver1, filter1);
Intent i1=new Intent(ctx, Service1.class);
ctx.startService(i1);
receiver2=new Receiver2();
IntentFilter filter2=new IntentFilter(Service2.MY_ACTION);
ctx.registerReceiver(receiver2, filter2);
Intent i2=new Intent(ctx, Service2.class);
ctx.startService(i2);
}
}