使用广播震动时启动应用程序

时间:2016-10-06 11:50:27

标签: java android eclipse broadcastreceiver android-sensors

我想要的是,当我的应用程序处于后台并且我摇动手机时应用程序应该启动并进入前台!

为实现这一点,我使用了广播接收器如下:

.state('menu.settings.term_of_service', {
        url: '/term_of_service',
          views: {
          'side-menu-ineevent@menu' :{
            templateUrl:'templates/term_of_service.html'
          }
        }
    })

    .state('menu.settings', {
        url: '/settings',
        cache: false,
        views: {
          'side-menu-ineevent': {
            templateUrl: 'templates/settings.html',
            controller: 'SettingsCtrl'
          }
        }
    })

我已将其注册如下:

public class BootReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context arg0, Intent arg1) {
            // TODO Auto-generated method stub
             mSensorManager = (SensorManager) arg0.getSystemService(arg0.SENSOR_SERVICE);
               mSensorManager.registerListener( mSensorIntentListener, mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);
        }

    }

现在对于震动事件,我使用下面给出的代码:

<receiver 

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

现在,当我尝试运行应用程序并将其放在背景上并摇动它时,它不起作用!

那么什么是逻辑错误以及如何使我的应用程序在摇动时成为前景?

我还在使用嵌套类概念,所以所有类都在 MainActivity 类中!

代码已满! :

private final SensorEventListener mSensorIntentListener = new SensorEventListener() {

            public void onSensorChanged(SensorEvent se) {
              float x = se.values[0];
              float y = se.values[1];
              float z = se.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
              if (mAccel > 12) {
                     Toast.makeText(getApplicationContext(), "Device has shaken.", Toast.LENGTH_LONG).show();
                     Intent intent = new Intent(getApplicationContext(), MainActivity.class)
                                .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                            startActivity(intent);
              }

            }

            @Override
            public void onAccuracyChanged(Sensor arg0, int arg1) {
                // TODO Auto-generated method stub

            }


     };

2 个答案:

答案 0 :(得分:1)

您的<receiver>元素不起作用。如果您在重新启动时查看LogCat,您会看到来自Android的警告或错误,说它无法找到您的BootReceiver课程。清单注册的接收者不能是活动内的嵌套类。

摆脱<receiver>元素。摆脱BootReceiver。在您的SensorEventListener活动中注册onCreate()。只要您的进程正在运行(可能不会很长),并且只要设备已打开,您就应该接收传感器事件。

答案 1 :(得分:0)

要捕获震动,您应该使用永远在线的低功率传感器,这些传感器已在一个wakelocked粘性服务中注册。要获得大量设备,您的应用应该可以找到手机中可用的低功耗传感器。然后使用最佳组合,最大限度地减少电池电量消耗。您还需要确保将您的应用列入白名单以进行电池优化,以便您的应用可以在后台存活。