加速度计似乎只能工作几秒钟?

时间:2016-02-02 15:16:49

标签: android android-intent broadcastreceiver accelerometer

在Android Manifest中使用它:

<receiver android:name=".OnBootReceiver">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
        <action android:name="android.intent.action.QUICKBOOT_POWERON" />
    </intent-filter>
</receiver>

以下作为OnBootReceiver.class:

package io.cordova.hellocordova;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.hardware.Sensor;
import android.hardware.SensorManager;

public class OnBootReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        SensorManager sManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
        Sensor sensor = sManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        sManager.registerListener(new ShakeEventManager(context), sensor, SensorManager.SENSOR_DELAY_NORMAL);
    }
}

最后是以下ShakeEventManager.class:

package io.cordova.hellocordova;

import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.util.Log;

public class ShakeEventManager implements SensorEventListener {
    private Context mContext;

    public ShakeEventManager(Context context) {
        mContext = context;
    }

    @Override
    public void onSensorChanged(SensorEvent sensorEvent) {
        Log.i("testing", "Sensor changed");
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {

    }
}

每次重新启动手机时,“传感器已更改”输出会反复记录几秒钟,然后停止。就好像Android中的某些东西正在检测无限循环并杀死应用程序。这可能吗?

这是三星Galaxy S6 Edge上的Android 5.1.1。三星捆绑节电系统作为标准,但禁用此功能似乎没有效果。

我认为可能发生的另一件事是我的Manifest接收器块中列出的两个动作是冲突的,即第一个触发器是创建侦听器而第二个触发器然后崩溃它,但是我找到的所有示例列表两者都删除似乎没有任何效果。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

这取自BroadcastReceiver上的Android Documentation

  

BroadcastReceiver对象仅在通话期间有效   to onReceive(Context,Intent)。一旦你的代码从此返回   功能,系统认为要完成的对象不再   活性

     

这对你能做些什么有重要的影响   onReceive(Context,Intent)实现:需要的任何东西   异步操作不可用,因为您需要   从函数返回来处理异步操作,但是在   那一点,BroadcastReceiver不再是活动的,因此   系统可以在异步操作之前自由地终止其进程   完成。

听起来就像你的情况一样。 BroadcastReceiver不再有效,因此系统会终止该过程。

为避免这种情况,您可以将SensorChangedListener移到Service,然后从Service内启动BroadcastReceiver。这样你就会继续收到这些活动。