【问题标题】:How to get broadcast for screen lock in android如何在android中获取屏幕锁定广播
【发布时间】:2013-11-11 05:27:02
【问题描述】:

如何在android中触发屏幕被锁定或打开??

我尝试在广播接收器中使用 SCREEN_OFF 和 SCREEN_ON 操作,但它不起作用。

public void onReceive(Context context, Intent intent) {
    Log.d("XYZ", "Screen ON/OFF");

    Toast.makeText(context, "screen",10000).show();
    if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
        .......
    }
}

在活动中我已经注册了广播喜欢-

屏幕是我的广播接收器的对象

IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
filter.addAction(Intent.ACTION_SCREEN_OFF);
mContext.registerReceiver(screen, filter);

【问题讨论】:

  • 您是否在清单中或以编程方式注册了您的接收器??
  • 您在哪里注册广播接收器?
  • 查看SO
  • 创建 1 个服务并在服务中注册 boradcast 接收器..并在 mainActivity 启动时启动服务。通过这样做,您的接收器将在屏幕关闭或@yuva 上触发
  • @yuvaツ 你是怎么解决你的问题的?

标签: android android-intent broadcastreceiver screen-off


【解决方案1】:

在您的 MainActivity.class 中调用 UpdateService.class

startService(new Intent(MainActivity.this, UpdateService.class));

UpdateService.class

public class UpdateService extends Service {

    BroadcastReceiver mReceiver;
    public static int countOn = 0;
    public static int countOff = 0;

    @Override
    public void onCreate() {
        super.onCreate();
        // register receiver that handles screen on and screen off logic
        Log.i("UpdateService", "Started");
        IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
        filter.addAction(Intent.ACTION_SCREEN_OFF);
        filter.addAction(Intent.ACTION_ANSWER);
        mReceiver = new MyReceiver();
        registerReceiver(mReceiver, filter);
    }

    @Override
    public void onDestroy() {

        unregisterReceiver(mReceiver);
        Log.i("onDestroy Reciever", "Called");

        super.onDestroy();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // TODO Auto-generated method stub
        boolean screenOn = intent.getBooleanExtra("screen_state", false);
        if (!screenOn) {
            Log.i("screenON", "Called");
            Log.i("viaService", "CountOn =" + countOn);

            Toast.makeText(getApplicationContext(), "Awake", Toast.LENGTH_LONG)
                    .show();
        } else {
            Log.i("screenOFF", "Called");
            Log.i("viaService", "CountOff =" + countOff);
        }


        return START_STICKY;
    }
    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return null;
    }
}

接收器类

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("via Receiver","Normal ScreenOFF" );
        } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
            screenOff = false;
        } else if(intent.getAction().equals(Intent.ACTION_ANSWER)) {

        }

        Intent i = new Intent(context, UpdateService.class);
        i.putExtra("screen_state", screenOff);
        context.startService(i);
    }

}

【讨论】:

  • 该服务将持续运行以检查屏幕的开启或关闭。我只想避免这种情况。
【解决方案2】:

嘿尝试使用广播的动态调用,我试过这个它会很好地工作......

public class MainActivity extends Activity {
     //Create broadcast object
       BroadcastReceiver mybroadcast = new BroadcastReceiver() {

        //When Event is published, onReceive method is called
        @Override
        public void onReceive(Context context, Intent intent) {
            // TODO Auto-generated method stub
                Log.i("[BroadcastReceiver]", "MyReceiver");

                if(intent.getAction().equals(Intent.ACTION_SCREEN_ON)){
                    Log.i("[BroadcastReceiver]", "Screen ON");
                }
                else if(intent.getAction().equals(Intent.ACTION_SCREEN_OFF)){
                    Log.i("[BroadcastReceiver]", "Screen OFF");
                }

        }
    };

     @Override
       public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);

       registerReceiver(mybroadcast, new IntentFilter(Intent.ACTION_SCREEN_ON));
       registerReceiver(mybroadcast, new IntentFilter(Intent.ACTION_SCREEN_OFF));
     }
    }

【讨论】:

  • 我没有收到任何错误。但我看不到我在接收器中提到的任何日志/吐司
  • 您必须创建一个服务并尝试在该服务中调用广播。
  • 但是该服务应该运行很长时间。它会消耗电池,因为我想检测屏幕关闭和打开。如果屏幕打开那么我只想启动我的应用程序服务
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 2020-03-10
  • 2014-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-16
相关资源
最近更新 更多