服务或广播接收器

时间:2014-12-23 20:02:29

标签: android service broadcastreceiver alert accelerometer

我正在开发一个Android应用程序,它通过检测抖动生成一个警告对话框。 我想在后台运行该应用程序,这样每当我们摇动手机时,应用程序将自动打开警告对话框。

我面临的问题是,我应该把震动的模块放在哪里。

我已将该模块放在StartCamm​​and()中,但它没有用。

是否可以使用BroadcastReceiver实现我的应用程序?

请帮忙.. 提前谢谢。

这是在检测Shaking时生成警告对话框的模块

public void onShake(float force) {
        // TODO Auto-generated method stub
        AlertDialog.Builder alertDialog=new AlertDialog.Builder(Shake.this);
        alertDialog.setTitle("Confirm your condition");
        alertDialog.setMessage("Are you OK?");
        alertDialog.setPositiveButton("YES", new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface arg0, int arg1) {
                // TODO Auto-generated method stub
                Toast.makeText(getApplicationContext(),"Take Care!!!", Toast.LENGTH_LONG).show();

            }
        });
       alertDialog.setNegativeButton("No", new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface arg0, int arg1) {
                // TODO Auto-generated method stub
                Toast.makeText(getApplicationContext(), "Emergency will be reached",    Toast.LENGTH_LONG).show();

            }
        });
        alertDialog.show();

    }

这里我将Shake的代码放在StartCommand()

public int onStartCommand(Intent intent, int flags, int startid) {
            SensorEventListener sensorEventListener = new SensorEventListener(){
            private long now=0;
            private long timeDiff=0;
            private long lastUpdate=0;
            private long lastShake=0;
            private float x=0;
            private float y=0;
            private float z=0;
            private float lastX=0;
            private float lastY=0;
            private float lastZ=0;
            private float force=0;
            public void onAccuracyChanged(Sensor sensor,int accuracy){}
            public void onSensorChanged(SensorEvent event)
            {
                now=event.timestamp;
                x=event.values[0];
                y=event.values[1];
                z=event.values[2];
                if(lastUpdate==0)
                {
                    lastUpdate=now;
                    lastShake=now;
                    lastX=x;
                    lastY=y;
                    lastZ=z;
                    Toast.makeText(aContext, "No motion is detected", Toast.LENGTH_LONG).show();
                }
                else
               {
                    timeDiff=now-lastUpdate;
                    if(timeDiff>0)
                    {
                        force=Math.abs(x+y+z-lastX-lastY-lastZ);
                        if(Float.compare(force, threshold)>0)
                        {
                            if(now-lastShake>=interval)
                            {
                                listener.onShake(force);
                            }
                            else
                            {
                                Toast.makeText(aContext, "no motion is detected",  Toast.LENGTH_LONG).show();
                            }
                            lastShake=now;
                        }
                        lastX=x;
                        lastY=y;
                        lastZ=z;
                        lastUpdate=now;
                    }
                    else
                    {
                        Toast.makeText(aContext, "no motion is detected", Toast.LENGTH_LONG).show();
                    }
                }
                listener.onAccelerometerChanged(x,y,z);
            }

        };
        return START_STICKY;
    }

1 个答案:

答案 0 :(得分:0)

这听起来像服务的教科书示例。

为什么?

1)您希望它在后台运行 2)大概你希望它继续运行,即使用户退出你的应用程序。

http://developer.android.com/reference/android/app/Service.html

在我看来,在这种情况下你没有注册听众......请参阅:

http://developer.android.com/guide/topics/sensors/sensors_overview.html#sensors-monitor

具体来说:

@Override
  protected void onResume() {
    super.onResume();
    mSensorManager.registerListener(this, mLight, SensorManager.SENSOR_DELAY_NORMAL);
  }

  @Override
  protected void onPause() {
    super.onPause();
    mSensorManager.unregisterListener(this);
  }

如果您将相关的注册/取消注册呼叫移至您服务中的相应位置,则应解决此问题。

您可以相应地设置传感器的类型等。

但是,使用服务会使Dialog的显示变得复杂,并且在最终确定要使用哪个用例之前,您可能希望提供有关特定用例的更多信息。