gpt4 book ai didi

Android BroadcastReceiver 永远不会被调用

转载 作者:太空狗 更新时间:2023-10-29 16:42:01 24 4
gpt4 key购买 nike

我想实现一个处理屏幕开/关的服务。为此,我创建了 BootReceiver,它会在启动完成时调用并在其中启动我的服务。但是,我的 ScreenBroadcastReceiver 从未被调用,为什么?我是不是在错误的地方注册了它,我是在创建服务时做的...请帮我在哪里注册?

因此,该应用程序应在后台运行(无用户交互)并且它将记录屏幕打开和关闭 Activity 。我已经启动了这些代码,但似乎我需要注册我的 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;
}

}

这是 ScreenBroadcastReceiver:

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);

}

}

和 list :

<?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) {
}
}

关于Android BroadcastReceiver 永远不会被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16265667/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com