Android摇一摇打开应用
1. 注册重力传感器,计算加速度,达到临界值,do something.
2. 启动Service在后台一直运行
3. 判断当前是不是在桌面
主要代码:ShakeListener
/** * 一个检测手机摇晃的监听器 加速度传感器 values[0]: x-axis 方向加速度 values[1]: y-axis 方向加速度 * values[2]: z-axis 方向加速度 */ public class ShakeListener implements SensorEventListener { // 速度的阈值,当摇晃速度达到这值后产生作用 private static final int SPEED_SHRESHOLD = 3000; // 两次检测的时间间隔 private static final int UPTATE_INTERVAL_TIME = 70; // 传感器管理器 private SensorManager sensorManager; // 传感器 private Sensor sensor; // 重力感应监听器 private OnShakeListener onShakeListener; // 上下文 private Context mContext; // 手机上一个位置时重力感应坐标 private float lastX; private float lastY; private float lastZ; // 上次检测时间 private long lastUpdateTime; // 构造器 public ShakeListener(Context c) { // 获得监听对象 mContext = c; start(); } // 开始 public void start() { // 获得传感器管理器 sensorManager = (SensorManager) mContext .getSystemService(Context.SENSOR_SERVICE); if (sensorManager != null) { // 获得重力传感器 sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); } // 注册 if (sensor != null) { // 还有SENSOR_DELAY_UI、SENSOR_DELAY_FASTEST、SENSOR_DELAY_GAME等, // 根据不同应用,需要的反应速率不同,具体根据实际情况设定 sensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_NORMAL); } } // 停止检测 public void stop() { sensorManager.unregisterListener(this); } // 设置重力感应监听器 public void setOnShakeListener(OnShakeListener listener) { onShakeListener = listener; } // 重力感应器感应获得变化数据 public void onSensorChanged(SensorEvent event) { // 现在检测时间 long currentUpdateTime = System.currentTimeMillis(); // 两次检测的时间间隔 long timeInterval = currentUpdateTime - lastUpdateTime; // 判断是否达到了检测时间间隔 if (timeInterval < UPTATE_INTERVAL_TIME) return; // 现在的时间变成last时间 lastUpdateTime = currentUpdateTime; // 获得x,y,z坐标 float x = event.values[0]; float y = event.values[1]; float z = event.values[2]; // 获得x,y,z的变化值 float deltaX = x - lastX; float deltaY = y - lastY; float deltaZ = z - lastZ; // 将现在的坐标变成last坐标 lastX = x; lastY = y; lastZ = z; double speed = Math.sqrt(deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ) / timeInterval * 10000; // 达到速度阀值,发出提示 if (speed >= SPEED_SHRESHOLD) { onShakeListener.onShake(); } } // 当传感器精度改变时回调该方法 public void onAccuracyChanged(Sensor sensor, int accuracy) { } // 摇晃监听接口 public interface OnShakeListener { public void onShake(); }
判断是否在桌面:
/** * 获得属于桌面的应用的应用包名称 * * @return 返回包含所有包名的字符串列表 */ private List<String> getHomes() { List<String> names = new ArrayList<String>(); PackageManager packageManager = this.getPackageManager(); // 属性 Intent intent = new Intent(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_HOME); List<ResolveInfo> resolveInfo = packageManager.queryIntentActivities( intent, PackageManager.MATCH_DEFAULT_ONLY); for (ResolveInfo ri : resolveInfo) { names.add(ri.activityInfo.packageName); System.out.println(ri.activityInfo.packageName); } return names; } /** * 判断是否在桌面,只有在桌面的时候才触发传感器 * * @return */ private boolean isAtHome() { boolean atHome; ActivityManager mActivityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); List<RunningTaskInfo> rti = mActivityManager.getRunningTasks(1); atHome = getHomes().contains(rti.get(0).topActivity.getPackageName()); return atHome; }
Service文件
public class ShakeService extends Service { private static final String TAG = "ShakeService"; ShakeListener mShakeListener = null; // Vibrator mVibrator; private long lastTime; @Override public IBinder onBind(Intent arg0) { // TODO Auto-generated method stub return null; } @Override public void onCreate() { Log.e(TAG, "onCreate"); super.onCreate(); // 获得振动器服务 // mVibrator = (Vibrator) getApplication().getSystemService( // VIBRATOR_SERVICE); // 实例化加速度传感器检测类 mShakeListener = new ShakeListener(ShakeService.this); } @Override public void onDestroy() { super.onDestroy(); Log.e(TAG, "onDestory"); } @Override public void onStart(Intent intent, int startId) { super.onStart(intent, startId); mShakeListener.setOnShakeListener(new OnShakeListener() { public void onShake() { long currentTime = System.currentTimeMillis(); long inteval = currentTime - lastTime; lastTime = currentTime; if (inteval < 100 && isAtHome()) { mShakeListener.stop(); startVibrato(); // 开始 震动 new Handler().postDelayed(new Runnable() { @Override public void run() { Intent intent = new Intent(); intent.setClass(ShakeService.this, ShakeActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); // Toast mtoast; // mtoast = Toast.makeText(ShakeService.this, // "呵呵,成功了!。\n再试一次吧!", 1000); // mtoast.show(); // mVibrator.cancel(); mShakeListener.start(); } }, 2000); } } }); } // 定义震动 public void startVibrato() { // mVibrator.vibrate(new long[] { 500, 200, 500, 200 }, -1); // 第一个{}里面是节奏数组, // 第二个参数是重复次数,-1为不重复,非-1则从pattern的指定下标开始重复 }}
ShakeActivity启动Service
startService(new Intent(this, ShakeService.class));
在AndroidMenifest.xml中注册
<application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.shakedemo.ShakeActivity" android:label="@string/app_name" android:launchMode="singleTask" android:screenOrientation="portrait" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <service android:name=".ShakeService" android:enabled="true" > </service> </application>
所需权限:
<!-- 允许一个程序获取信息有关当前或最近运行的服务,一个缩略的任务状态,是否活动等 --> <uses-permission android:name="android.permission.GET_TASKS" />
注意:在Service中打开应用 需要添加i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
参考http://blog.csdn.net/androidbluetooth/article/details/6847743
http://blog.csdn.net/you_and_me12/article/details/7284749
http://www.cnblogs.com/jfttcjl/articles/2272365.html
横竖屏切换的设置会影响吗??
有时间再写
1.摇一摇加音量键打开应用
2.开机启动service http://redarmychen.iteye.com/blog/1144358