2

我想在屏幕关闭时打开我的 MainActivity 类。为了做到这一点,我制作了两个类 ScreenReceiver.java 来处理屏幕关闭和屏幕开启意图:

public class ScreenReceiver extends BroadcastReceiver {

 private boolean screenOff;

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
            screenOff = true;
        } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
            screenOff = false;
        }
        Intent i = new Intent(context, UpdateService.class);
        i.putExtra("screen_state", screenOff);
        context.startService(i);
    }

}

以及用于实现 ScreenReceiver 的 UpdateService:

public  class UpdateService extends Service {

@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);
    BroadcastReceiver mReceiver = new ScreenReceiver();
    registerReceiver(mReceiver, filter);
}

public void onStart(Context context, Intent intent, int startId) {
    boolean screenOn = intent.getBooleanExtra("screen_state", false);
    if (!screenOn) {
        // your code
         Intent intent11 = new Intent(context,MainActivity.class);
         intent11.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
         context.startActivity(intent11);
    } else {
        // your code
        Intent intent11 = new Intent(context,MainActivity.class);
        intent11.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    }
}

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

}

所以,当我安装我的应用程序时,屏幕关闭时没有事件。请告诉我问题。

4

2 回答 2

0

首先,intentsACTION_SCREEN_OFF只能ACTION_SCREEN_ON由通过 function 注册的接收者处理registerReceiver()。在 manifest.xml 中定义一个IntentFilter不适用于这些意图。

然后,您需要确保UpdateService:onCreate()在您的应用程序中被调用,否则ScreenReceiver:onReceiver()将永远不会被调用。当你有意图时你可能想这样做BOOT_COMPLETED

您可以将代码更改为此,并且不要忘记在清单中定义服务:

public class UpdateService extends Service {

    BroadcastReceiver mReceiver = new BroadcastReceiver {
    private boolean screenOff;

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
            screenOff = true;
        } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
            screenOff = false;
        }
        handleScreenAction(screenOff);
    }

    private void handleScreenAction(boolean screenOff) {
        if (screenOff) {
            // your code
            Intent intent11 = new Intent(context,MainActivity.class);
            intent11.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(intent11);
        } else {
            // your code
            Intent intent11 = new Intent(context,MainActivity.class);
            intent11.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        }
    }

    @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);
        registerReceiver(mReceiver, filter);
    }

    @Override
    public void onDestory() {
        super.onDestory();
        unRegisterReceiver(mReceiver);
    }

    public void onStart(Context context, Intent intent, int startId) {
    }

    @Override
    public IBinder onBind(Intent intent) {
    // TODO Auto-generated method stub
        return null;
    }
}
于 2014-02-26T20:19:40.283 回答
0

您是否在应用程序某处的前台启动了 UpdateService?

于 2013-02-19T14:54:34.207 回答