我在屏幕休眠后注册传感器。如果设备检测到震动事件,我必须唤醒屏幕。 如果我将设备与系统连接,设备会正确唤醒。 如果我断开设备, moto g设备,色度平板电脑不会醒来。但三星设备醒来了。
因此我通过在textview中显示logcat值进行了测试。 我发现了以下问题: 有时屏幕关闭后,我没有收到广播消息。 有时候我会收到消息,但是摇动设备后maccel值也没有增加。
我使用以下代码:
初始化传感器管理器:
manager=(SensorManager) getSystemService(Context.SENSOR_SERVICE);
sensor=manager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
注册广播接收器:
registerReceiver(screenoffreceiver, new IntentFilter(Intent.ACTION_SCREEN_OFF));
广播接收器:
private BroadcastReceiver screenoffreceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
Bundle extras = intent.getExtras();
if (Intent.ACTION_SCREEN_OFF.equalsIgnoreCase(intent.getAction())) {
//screen has been switched off!
manager.registerListener(Testing.this, manager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);
}
}
};
用于检测摇晃事件:
public void onSensorChanged(SensorEvent event) {
float x = event.values[0];
float y = event.values[1];
float z = event.values[2];
mAccelLast = mAccelCurrent;
mAccelCurrent = (float) Math.sqrt((double) (x*x + y*y + z*z));
float delta = mAccelCurrent - mAccelLast;
mAccel = mAccel * 0.9f + delta; // perform low-cut filter
Log.i("mAccel", "mAccel "+mAccel);
mytext.setText(mytext.getText().toString()+" "+mAccel);
if(mAccel>=1) {
unlock_screen();
}
请帮我解决这些问题。
答案 0 :(得分:0)
如果您想确保操作系统不会杀死/回收您的服务,您需要将其作为前台服务。默认情况下,所有服务都是后台服务,这意味着当OS需要资源时它们将被终止。有关详细信息,请参阅此文档
基本上,您需要为服务创建通知并指明它是前台。这样,用户将看到持久通知,因此他知道您的应用正在运行,并且操作系统不会终止您的服务。
Intent intent = new Intent(this, typeof(SomeActivityInYourApp));
PendingIntent pi = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
builder.setSmallIcon(Resource.Drawable.my_icon);
builder.setTicker("App info string");
builder.setContentIntent(pi);
builder.setOngoing(true);
builder.setOnlyAlertOnce(true);
Notification notification = builder.build();
// optionally set a custom view
startForeground(SERVICE_NOTIFICATION_ID, notification);
答案 1 :(得分:0)
如果我在设备锁定后将设备与系统连接,则cpu会继续运行。因此,当我调用unlock_screen()方法时,设备会唤醒。 如果我断开设备,在进入锁定模式后,cpu就不会运行。因此,当我调用unlock_screen()方法时,设备不会被唤醒。 所以我使用了 PARTIAL_WAKE_LOCK 来运行Cpu。