Demo说明
由于Android8.0无法对系统广播进行隐式注册,所以在8.0及以上的版本在程序不在后台运行的情况下无法直接启动APP。若各位有啥好的解决方法,可以评论告诉我,我好学习一下。
Demo下载地址:https://download.youkuaiyun.com/download/m0_37203554/10573992
MainActivity.java
注意一下设置Activity的启动方式,不然会导致摇了几次后手机上一堆MainActivity的界面
public class MainActivity extends AppCompatActivity {
MyReceiver mMyReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/*****************************与本Demo无关*********************************/
//过滤器
IntentFilter mIntentFilter = new IntentFilter();
//创建广播接收者的对象
mIntentFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
mIntentFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
mIntentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
mMyReceiver = new MyReceiver();
//注册广播接收者的对象
try {
unregisterReceiver(mMyReceiver);
registerReceiver(mMyReceiver, mIntentFilter);
} catch (Exception e) {
e.printStackTrace();
registerReceiver(mMyReceiver, mIntentFilter);
}
/*************************************************************************/
//启动“摇一摇启动”服务
Intent intent1 = new Intent(this,MyService.class);
this.startService(intent1);
}
@Override
protected void onStop() {
super.onStop();
unregisterReceiver(mMyReceiver);
}
}
MyService.java
/**
* “摇一摇启动”服务
*/
public class MyService extends Service {
public MyService() {
super();
}
@Override
public void onCreate() {
super.onCreate();
Log.d("MyService", "onCreate");
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
Log.d("MyService", "onBind");
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d("MyService", "onStartCommand");
//设置加速度传感器监听
SensorManager manager = (SensorManager) this.getSystemService(Service.SENSOR_SERVICE);
MySensorEventListener listener = new MySensorEventListener(getApplicationContext());
manager.registerListener(listener, manager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
Log.d("MyService", "onDestroy");
super.onDestroy();
}
@Override
public boolean onUnbind(Intent intent) {
Log.d("MyService", "onUnbind");
return super.onUnbind(intent);
}
}
MySensorEventListener.java
/**
* 自定义监听用户的摇一摇手势
*/
public class MySensorEventListener implements SensorEventListener {
private Context mContext;
public MySensorEventListener(Context mContext) {
this.mContext = mContext;
}
@Override
public void onSensorChanged(SensorEvent event) {
//获取传感器类型
int sensorType = event.sensor.getType();
//values[0]:X轴,values[1]:Y轴,values[2]:Z轴
float[] values = event.values;
//如果传感器类型为加速度传感器,则判断是否为摇一摇
if(sensorType == Sensor.TYPE_ACCELEROMETER){
// Log.d("MySensorEventListener", "onSensorChanged: x===="+values[0]+"y===="+values[1]+"z===="+values[2]);
if ((Math.abs(values[0]) > 17 || Math.abs(values[1]) > 17 || Math.abs(values[2]) > 17))
{
Log.d("MySensorEventListener", "sensor x============ values[0] = " + values[0]);
Log.d("MySensorEventListener", "sensor y============ values[1] = " + values[1]);
Log.d("MySensorEventListener", "sensor z ============ values[2] = " + values[2]);
//开启APP主页,注意主页的启动方式为singleTop
Intent i = new Intent(mContext, MainActivity.class);
mContext.startActivity(i);
}
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
}