在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接收器块中列出的两个动作是冲突的,即第一个触发器是创建侦听器而第二个触发器然后崩溃它,但是我找到的所有示例列表两者都删除似乎没有任何效果。
有什么想法吗?
答案 0 :(得分:2)
这取自BroadcastReceiver
上的Android Documentation。
BroadcastReceiver对象仅在通话期间有效 to onReceive(Context,Intent)。一旦你的代码从此返回 功能,系统认为要完成的对象不再 活性
这对你能做些什么有重要的影响 onReceive(Context,Intent)实现:需要的任何东西 异步操作不可用,因为您需要 从函数返回来处理异步操作,但是在 那一点,BroadcastReceiver不再是活动的,因此 系统可以在异步操作之前自由地终止其进程 完成。
听起来就像你的情况一样。 BroadcastReceiver
不再有效,因此系统会终止该过程。
为避免这种情况,您可以将SensorChangedListener
移到Service
,然后从Service
内启动BroadcastReceiver
。这样你就会继续收到这些活动。