Android : 出现锁屏时播放

Android : Broadcast when screen lock appear

我想 运行 一个当 android phone 屏幕锁定出现时的方法。

我测试了 ACTION_SCREEN_ON 作为广播,但它只在 activity 直播时有效。

我也测试了ACTION_USER_PRESENT,在phone解锁的时候可以用,但是我想运行解锁前的方法(刚出现锁屏的时候)

我也测试了AlarmManager每1分钟重复一次闹钟,但是这个解决方案有两个缺陷:

  1. 电池很快就没电了。
  2. 这是一种已弃用的方式,我不需要每 1 分钟执行一次方法。

我该怎么办?

您可以创建一个监听 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);
    }
}

完整答案:

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

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

 </application>

服务 class :

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

接收者class:

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);
}