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);}}}}使用此