Android:屏幕锁定时显示广播

时间:2016-01-01 12:47:09

标签: android android-broadcast

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

我将ACTION_SCREEN_ON作为广播进行了测试,但它仅在活动有效时才有效。

我还测试了ACTION_USER_PRESENT,它在手机解锁时有效,但我想在解锁之前运行该方法(就在出现屏幕锁定时)。

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

  1. 电池很快就会变空。
  2. 这是一种弃用的方式,我不需要每1分钟做一次方法。
  3. 我该怎么办?

2 个答案:

答案 0 :(得分: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);
    }
}

答案 1 :(得分:1)

完整答案:

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