1

画面のロックとロック解除をしようとしていますが、

画面がオンかオフかを確認する次のようにやっているとBroadcast receiver、画面がオンの場合は画面をロックし、オフの場合は画面のロックを解除します。

私が使用しているコードBroadcast receiver

public void onReceive(Context context, Intent intent) {

        System.out.println("Entered Broadcaste Reciever........");
       context1 = context;
        if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
            // DO WHATEVER YOU NEED TO DO HERE
             mShaker = new ShakeListener(context);
                mShaker.setOnShakeListener(new ShakeListener.OnShakeListener () {
                  public void onShake()
                  {
                     PowerManager TempPowerManager = (PowerManager) context1.getSystemService(Context.POWER_SERVICE);
                    PowerManager.WakeLock TempWakeLock = TempPowerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP |PowerManager.ON_AFTER_RELEASE, "TempWakeLock");
                    TempWakeLock.acquire();
                    final Vibrator vibe = (Vibrator)context1.getSystemService(Context.VIBRATOR_SERVICE);
                    vibe.vibrate(100);
            System.out.println("LISTENING SHAKE");
                  }
                });

        }
        else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
            // AND DO WHATEVER YOU NEED TO DO HERE

             mShaker = new ShakeListener(context);
                mShaker.setOnShakeListener(new ShakeListener.OnShakeListener () {
                  public void onShake()
                  {

                        mDPM = (DevicePolicyManager)context1.getSystemService(Context.DEVICE_POLICY_SERVICE);



                    ComponentName mAdminName = new ComponentName(context1,LockActivity.class);
                    IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON); 
                    filter.addAction(Intent.ACTION_SCREEN_OFF);
                    BroadcastReceiver mReceiver = new ScreenReceiver();
                    context1.registerReceiver(mReceiver, filter);
                    System.out.println("The Device  device admin enabled");
                    Intent  intent = new             Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
  intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, mAdminName);
                                           intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION,"onEnabled");
                                   mDPM.lockNow();
                                   mDPM.setMaximumTimeToLock(mAdminName,0);
                                   intent.putExtra("force-locked", DeviceAdminInfo.USES_POLICY_FORCE_LOCK);
   //                                           startActivityForResult(intent, 1); 
                  }
                });
        }

問題は、正常に起動し、最大 5 回まで正常に動作し、その後、無限状態になり、デバイスがスタックすることです..誰かが解決策を見つけるのを手伝ってください.

4

1 に答える 1

1

システム画面がオフになる前のイベントの順序は次のとおりです。

ExampleActivity.onPause() –> ScreenReceiver.onReceive()

レシーバーが最初にヒットすると思うので、これは少し直感的ではありません。したがって、ブール値の設定などをいじるときは、この小さな事実に注意してください。同様に、画面がオンになったときのイベントの順序は次のとおりです。

ExampleActivity.onResume() –> ScreenReceiver.onReceive()

 @Override
    protected void onPause() {
        // when the screen is about to turn off
        if (ScreenReceiver.wasScreenOn) {
            // this is the case when onPause() is called by the system due to a screen state change
            System.out.println("SCREEN TURNED OFF");
        } else {
            // this is when onPause() is called when the screen state has not changed
        }
        super.onPause();
    }

    @Override
    protected void onResume() {
        // only when screen turns on
        if (!ScreenReceiver.wasScreenOn) {
            // this is when onResume() is called due to a screen state change
            System.out.println("SCREEN TURNED ON");
        } else {
            // this is when onResume() is called when the screen state has not changed
        }
        super.onResume();
    }

ここから参照

于 2013-03-05T06:53:35.090 に答える