ACTION_USER_PRESENT,ACTION_SCREEN_ON,ACTION_BOOT_COMPLETED的广播接收器

时间:2011-10-01 10:40:55

标签: android android-manifest broadcastreceiver

我正在创建一个使用广播接收器的类。我希望在解锁手机时收到广播。但是有一些问题。请帮帮我。

我的Manifest.xml是: -

<receiver android:name=".MyReciever">
    <intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.ACTION_USER_PRESENT" />
            <action android:name="android.intent.action.ACTION_BOOT_COMPLETED" />
            <action android:name="android.intent.action.ACTION_SCREEN_ON" />
        </intent-filter>
    </intent-filter>
</receiver>

和我的广播接收班: -

public class MyReiever extends BroadcastReceiver {

   @Override
   public void onReceive(Context context, Intent intent) {
   Log.d("My Reciever","is intent null => " + (intent == null));
   Log.d("My Reciever",intent.getAction()+"");
   }
}

虽然其他应用程序和服务正在接收“Screen_on”和“USer_Present”的广播,例如。 WifiService。

5 个答案:

答案 0 :(得分:5)

虽然Java常量是android.content.intent.ACTION_USER_PRESENTandroid.content.intent.ACTION_BOOT_COMPLETEDandroid.content.intent.ACTION_SCREEN_ON,但这些常量的android.intent.action.USER_PRESENT,{{1} }和android.intent.action.BOOT_COMPLETED。这些值需要出现在您的清单中。

但请注意,android.intent.action.SCREEN_ON的接收者不能在清单中声明,但必须由Java代码注册,例如参见this question

答案 1 :(得分:2)

由于隐式广播接收器从Android 8.0开始不起作用,因此您必须通过代码和清单注册接收器。

执行以下步骤:

  • 添加清单标签
<receiver android:name=".MyReciever">
    <intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.ACTION_USER_PRESENT" />
            <action android:name="android.intent.action.ACTION_BOOT_COMPLETED" />
            <action android:name="android.intent.action.ACTION_SCREEN_ON" />
        </intent-filter>
    </intent-filter>
</receiver>
  • 创建一个接收器类并添加您的代码
public class MyReciever extends BroadcastReceiver {

   @Override
   public void onReceive(Context context, Intent intent) {
   Log.d("My Reciever","is intent null => " + (intent == null));
   Log.d("My Reciever",intent.getAction()+"");
   }
}
  • 创建服务并在其中注册接收者
public class MyService extends Service {
MyReceiver receiver = new MyReceiver();

    @Override
    public IBinder onBind(Intent intent) { return null; }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        registerReceiver(receiver);
        return START_STICKY;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        unregisterReceiver(receiver);
    }
}
  • 别忘了在清单中定义服务
<service android:name=".MyService"/>

要使广播工作,必须在服务中进行注册。为了使您的服务持续有效,您可以使用alarm managersjobs等与该问题无关的工具。

答案 2 :(得分:1)

检查您的班级名称,即扩展BroadcastReceiver。它应该是“MyReciever”而不是“MyReiever”

答案 3 :(得分:1)

除了前面的答案中提到的Typo之外,还应该在receiver标记中完全提到接收器类包的名称,我认为问题在于所讨论的代码使用了两个嵌套的Intent过滤器。我相信这段代码可以正常工作:

 <receiver android:name=".MyReciever">
    <intent-filter>
            <action android:name="android.intent.action.ACTION_USER_PRESENT" />
            <action android:name="android.intent.action.ACTION_BOOT_COMPLETED" />
            <action android:name="android.intent.action.ACTION_SCREEN_ON" />
    </intent-filter>
</receiver>

答案 4 :(得分:1)

我只能给您一个快速提示,因为我走过的那条路您获得的成功要少得多。尝试使用java.util.logging读取logcat,以便您不需要读取日志的权限。在日志视图中,为包含“系统禁用”作为其标头的侦听器创建侦听器。它会在锁定和解锁时触发。检查是否可以访问system.android的屏幕,而不是其他屏幕。 希望能帮助到你。祝你好运