Android广播接收器从不被调用
我想实现一个处理屏幕开/关的服务。为此,我创建了Android广播接收器从不被调用,android,Android,我想实现一个处理屏幕开/关的服务。为此,我创建了BootReceiver,在启动完成并在启动服务时调用它。但是,我的ScreenBroadcastReceiver从未被调用,为什么?我是不是在错误的地方注册的,我是在创建服务时注册的。。。请帮我在哪里注册 因此,应用程序应该在后台运行(没有用户交互),它将记录屏幕上的打开和关闭活动。我已经开始使用这些代码,但似乎我需要注册ScreenBroadcastReceiver。如果我在创建服务时这样做。我应该换吗?我的最终目标是在后台运行这个应用程序,这
BootReceiver
,在启动完成并在启动服务时调用它。但是,我的ScreenBroadcastReceiver
从未被调用,为什么?我是不是在错误的地方注册的,我是在创建服务时注册的。。。请帮我在哪里注册
因此,应用程序应该在后台运行(没有用户交互),它将记录屏幕上的打开和关闭活动。我已经开始使用这些代码,但似乎我需要注册ScreenBroadcastReceiver。如果我在创建服务时这样做。我应该换吗?我的最终目标是在后台运行这个应用程序,这样应用程序就可以在没有用户交互的情况下工作
这是一开始调用的BootReceiver:
public class BootReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.w("TAG", "BootReceiver");
Intent service = new Intent(context, ScreenListenerService.class);
context.startService(service);
}
}
这是服务:
public class ScreenListenerService extends Service {
public void onCreate(){
super.onCreate();
Log.w("TAG", "ScreenListenerService---OnCreate ");
IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
filter.addAction(Intent.ACTION_SCREEN_OFF);
BroadcastReceiver screenOnReceiver = new ScreenBroadcastReceiver();
registerReceiver(screenOnReceiver, filter);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.w("TAG", "ScreenListenerService---onStart ");
return START_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
}
这是屏幕广播接收器:
public class ScreenBroadcastReceiver extends BroadcastReceiver {
///this part is never called, even if the screen is turned on/off.
public static boolean screenOff;
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
screenOff = true;
System.out.println("SCREEN TURNED OFF on BroadcastReceiver");
} else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
screenOff = false;
System.out.println("SCREEN TURNED ON on BroadcastReceiver");
}
Intent i = new Intent(context, ScreenListenerService.class);
i.putExtra("screen_state", screenOff);
context.startService(i);
}
}
以及舱单:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.test"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="10" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:name=".main"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name=".ScreenListenerService"></service>
<receiver android:name=".BootReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE" />
</intent-filter>
</receiver>
</application>
</manifest>
更新:
可以在模拟器中测试这段代码并告诉我结果吗 在
onStart()
方法中注册您的BroadcastReceiver
@Override
public void onStart(Intent intent, int startId) {
try {
IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
filter.addAction(Intent.ACTION_SCREEN_OFF);
BroadcastReceiver mReceiver = new ScreenReceiver();
registerReceiver(mReceiver, filter);
} catch (Exception e) {
}
}
检查您的服务是否在移动运行服务中运行。我在我的服务中打印了一些日志,这些日志打印得很好。但是,ScreenBroadcastReceiver没有日志。在服务中打印日志命令后,boradcastreceiver永远不会被调用(没有日志)。服务代码只运行一次,我缺少的是什么?您的服务肯定会运行,因为每次启动设备时都会发送一个启动完成的广播。但是你确定广播中会有屏幕吗?我想一直运行它,我怎么能确定广播中会有屏幕呢?我还尝试在android>2的StartCommand()上注册它,但它不起作用。顺便说一句,这真的对onStart()有影响吗?我可以同时使用这两个吗?我在我的一个项目中做了这件事,它工作正常。如果你需要,我会给你发送示例代码。只需提及你的邮件id。谢谢,我收到了你的电子邮件。但是,正如您所解释的,您使用活动通过按钮启动服务。在我的情况下,没有任何活动应该通过服务自动启动。好的,您需要一个引导完成的接收器来启动服务。请在BootReceiver类公共类BootReceiver extends BroadcastReceiver{@Override public void onReceive(上下文上下文,意图){Log.w(“标记”,“BootReceiver”)中进行更改;如果清单中的(intent.getAction().equals(intent.ACTION_BOOT_COMPLETED)){intent serviceentent=new intent();serviceentent.setAction(“服务类的完整包名”);context.startService(serviceentent);}}}}使用此