我正在开发一个Android应用程序,它通过检测抖动生成一个警告对话框。 我想在后台运行该应用程序,这样每当我们摇动手机时,应用程序将自动打开警告对话框。
我面临的问题是,我应该把震动的模块放在哪里。
我已将该模块放在StartCammand()中,但它没有用。
是否可以使用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;
}
答案 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的显示变得复杂,并且在最终确定要使用哪个用例之前,您可能希望提供有关特定用例的更多信息。