从后台启动活动时出错

时间:2015-01-26 19:26:45

标签: android service broadcastreceiver wakelock

我一直在寻找很多东西来解决我的问题,但我发现的解决方案都不适合我的情况:'(

以下是我要做的事情:

  
      
  1. 当屏幕关闭时,我的BroadCastReceiver会检测到它。
  2.   
  3. 一旦检测到screen_off,获取WakeLock并且我的BroadCastReceiver启动我的自定义空闲屏幕活动。
  4.   

(至于它开始空闲屏幕活动的位置,我已尝试过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,它就应该自行唤醒并开始活动。

1 个答案:

答案 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()中显示此屏幕即可。如果您想要持久监控,请使用服务和通知来提醒用户有关事件的信息。如果你的应用程序需要继续运行,你应该在应用程序进入后台之前获取唤醒锁定,并在不再需要时释放它。