代码之家  ›  专栏  ›  技术社区  ›  mhk

Android:屏幕锁定出现时广播

  •  0
  • mhk  · 技术社区  · 10 年前

    我想在android手机屏幕锁定出现时运行一个方法。

    我测试了 ACTION_SCREEN_ON 作为一个广播,但只有在活动直播时才有效。

    我还测试了 ACTION_USER_PRESENT 当手机解锁时,它会起作用,但我想在解锁前运行该方法(就在屏幕锁定出现时)。

    我还测试了 AlarmManager 通过每1分钟重复报警,但该解决方案有两个缺陷:

    1. 电池很快就空了。
    2. 这是一种不推荐的方法,我不需要每1分钟执行一次方法。

    我该怎么办?

    2 回复  |  直到 10 年前
        1
  •  1
  •   Grace Coder    10 年前

    您可以创建一个收听ACTION_SCREEN_ON广播的服务。

    下面是供您参考的示例代码:

    public class LockScreenService extends Service {
    
        private BroadcastReceiver mScreenStateReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                switch (intent.getAction()) {
                    case Intent.ACTION_SCREEN_ON:
                        // do your stuff
                        break;
                }
            }
        };
    
        public LockScreenService () {}
    
        @Override
        public void onCreate() {
            super.onCreate();
    
            // register ACTION_SCREEN_ON receiver
            IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
            registerReceiver(mScreenStateReceiver, filter);
        }
    
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            // do some extra things
            return START_STICKY;
        }
    
        @Override
        public IBinder onBind(Intent intent) {
            // do not bind service to activity because service will end if activity is destroyed
            return null;
        }
    
        @Override
        public void onDestroy() {
            // release receiver
            unregisterReceiver(mScreenStateReceiver);
        }
    }
    
        2
  •  1
  •   mhk    10 年前

    完整答案:

    使用 service 并设置它 START_STICKY . 它导致终止服务后,服务将重新启动。 这是我的代码:

    android manifest : 
    <application 
    ....
        <service android:name=".UpdateService" />
    
     </application>
    

    服务等级:

    import android.app.Service;
    import android.content.BroadcastReceiver;
    import android.content.Intent;
    import android.content.IntentFilter;
    import android.os.IBinder;
    import android.util.Log;
    import android.widget.Toast;
    
    
    public class UpdateService extends Service {
    
        BroadcastReceiver mReceiver;
    
    
        @Override
        public void onCreate() {
            super.onCreate();
            // register receiver that handles screen on and screen off logic
            IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
    
            filter.addAction(Intent.ACTION_SCREEN_OFF);
            mReceiver = new MyReceiver();
            registerReceiver(mReceiver, filter);
        }
    
    
        @Override
        public void onDestroy() {
    
            unregisterReceiver(mReceiver);
            Log.i("onDestroy Reciever", "Called");
    
            super.onDestroy();
        }
    
    
        @Override
        public void onStart(Intent intent, int startId) {
            boolean screenOn = intent.getBooleanExtra("screen_state", false);
            if ( !screenOn) {
                Log.i("screenON", "Called");
                Toast.makeText(getApplicationContext(), "Awake", Toast.LENGTH_LONG)
                        .show();
            } else {
                Log.i("screenOFF", "Called");
                Toast.makeText(getApplicationContext(), "Sleep",
                        Toast.LENGTH_LONG)
                        .show();
            }
        }
    
    
        @Override
        public IBinder onBind(Intent intent) {
            // TODO Auto-generated method stub
            return null;
        }
    
    
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            return Service.START_STICKY;
        }
    }
    

    接收器类别:

    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.util.Log;
    
    
    public class MyReceiver extends BroadcastReceiver {
    
        private boolean screenOff;
    
    
        @Override
        public void onReceive(Context context, Intent intent) {
    
    
            if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
                screenOff = true;
                Log.i("screenLog", "screen off");
    
            } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
                screenOff = false;
                Log.i("screenLog", "screen on");
            }
    
    
        }
    }
    

    在StartupActivity中:

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    
    
            Context context = getApplicationContext();
            Intent service = new Intent(context, UpdateService.class);
            context.startService(service);
    }