9tontruck 0 Newbie Poster

Hi, I have been searching out a lot of things to sove my problem but none of the solutions I found worked in my case :'(

Here is what I am trying to do:
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.
(As for the location where it starts the idle screen activity, I have tried in BroadCastReceiver, IntentService and AsyncTask classes but all of them made same problem)

And this is the error message I am getting:

01-25 14:55:13.253: E/ActivityThread(10879): Activity com.example.test.MainActivity has leaked IntentReceiver com.example.test.BCReceiver@41fb1e48 that was originally registered here. Are you missing a call to unregisterReceiver()?
01-25 14:55:13.253: E/ActivityThread(10879): android.app.IntentReceiverLeaked: Activity com.example.test.MainActivity has leaked IntentReceiver com.example.test.BCReceiver@41fb1e48 that was originally registered here. Are you missing a call to unregisterReceiver()?

Here's my code:
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();
                Intent startHomescreen=new Intent(context, IdleScreenActivity.class);
                startHomescreen.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
                context.startActivity(startHomescreen);
            } 
        }
    }

manifest

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

Everything until "WakeLock" is working but starting an activity from the BroadCastReceiver makes the error. Some people said to put "unregisterReceiver(...)" in "onStop()" but this does not work to me because screen_off can never be detected as my Receiver gets unregistered before the screen_off event happens. Any other thoughts? Please help!