我一直在寻找很多东西来解决我的问题,但我发现的解决方案都不适合我的情况:'(
以下是我要做的事情:
- 当屏幕关闭时,我的BroadCastReceiver会检测到它。
- 一旦检测到screen_off,获取WakeLock并且我的BroadCastReceiver启动我的自定义空闲屏幕活动。
醇>
(至于它开始空闲屏幕活动的位置,我已尝试过BroadCastReceiver,IntentService和AsyncTask类,但所有这些类都有同样的问题)
这是我收到的错误消息:
01-25 14:55:13.253:E / ActivityThread(10879):活动com.example.test.MainActivity泄露了最初在此处注册的IntentReceiver com.example.test.BCReceiver@41fb1e48。你是否错过了对unregisterReceiver()的调用?
01-25 14:55:13.253:E / ActivityThread(10879):android.app.IntentReceiverLeaked:Activity com.example.test.MainActivity泄露了最初在这里注册的IntentReceiver com.example.test.BCReceiver@41fb1e48 。你是否错过了对unregisterReceiver()的调用?
这是我的代码:
MainActivity.java
public class MainActivity extends Activity {
BCReceiver mReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//register receiver
mReceiver = new BCReceiver();
registerReceiver(mReceiver, new IntentFilter(Intent.ACTION_SCREEN_OFF));
}
}
BCReceiver.java
public class BCReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)){
PowerManager pm = (PowerManager) context.getSystemService(context.POWER_SERVICE);
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.PARTIAL_WAKE_LOCK, "com.foreseeson.visionsaylauncher");
wl.acquire(); //works fine until here
Intent startHomescreen=new Intent(context, IdleScreenActivity.class);
startHomescreen.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
context.startActivity(startHomescreen);
}
}
}
清单
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.test"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="21" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="IdleScreenActivity"></activity>
</application>
</manifest>
所有事情直到&#34; WakeLock&#34;正在工作,但从BroadCastReceiver启动活动会产生错误。有些人说要放弃注册接收者(...)&#34; in&#34; onStop()&#34;但这对我不起作用,因为在screen_off事件发生之前我的Receiver未注册,因此无法检测到screen_off。还有其他想法吗?请帮忙!
修改 我正在创建一个自助服务终端应用程序。因此,如果没有人玩我的自助服务终端设备并且经过一段时间,屏幕就会关闭,它应该在屏幕上显示我的活动。我搜索过,检测用户不活动的最佳方法是检测screen_off。因此,一旦检测到screen_off,它就应该自行唤醒并开始活动。
答案 0 :(得分:0)
取消你的要求,
1. When the screen is off, my BroadCastReceiver detects it.
2. Once screen_off is detected, acquire WakeLock and my BroadCastReceiver starts my custom idle screen activity.
好的,屏幕关闭,此时您不应该将手机唤醒以显示任何内容。屏幕因为用户未使用该应用程序而关闭。
如果要显示空闲屏幕以供用户在返回应用程序时查看,您只需在onResume()中显示此屏幕即可。如果您想要持久监控,请使用服务和通知来提醒用户有关事件的信息。如果你的应用程序需要继续运行,你应该在应用程序进入后台之前获取唤醒锁定,并在不再需要时释放它。