2014-12-23 4 views
0

Я разрабатываю приложение для Android, которое создает диалоговое окно предупреждения, обнаруживая встряхивание. Я хочу запустить это приложение в фоновом режиме, чтобы всякий раз, когда мы встряхиваем телефон, приложение автоматически открывает диалоговое окно.Услуги или широковещательный приемник

Я столкнулся с проблемой на том месте, где я должен поместить модуль встряхивания.

Я поставил этот модуль в StartCammand(), но это didnot работа ..

Можно ли реализовать мое приложение с помощью BroadcastReceiver?

Пожалуйста, помогите .. Заранее спасибо.

Вот модуль, который будет генерировать диалоговое окно предупреждения при обнаружении встряхивания

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(); 

    } 

Здесь я поставил код встряска в Команда пуска()

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

Когда вы вызываете Context.startService() в службе? –

+0

@ NathanielD.WaggonerI назовите его в классе MainActivity, где я передаю намерение, чтобы перейти к Activity, который расширяет Service – krati

+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); 
    } 

Если вы вместо того, чтобы переместите соответствующие регистрационные/незарегистрированные вызовы в соответствующие местоположения в своей службе, это должно само решить.

Вы можете установить тип датчика и т. Д. Соответственно.

Однако использование службы затрудняет презентацию Диалога, и вы можете представить более подробную информацию о своем конкретном прецеденте, прежде чем принимать окончательное определение того, что использовать.

+0

Я зарегистрировался в SensorListener..Когда я запускаю это приложение, не работая в фоновом режиме, он отлично работает, но когда я хочу, чтобы он работал в фоновом режиме, он didnot run.I расширяет его с помощью службы, но он didnot работы. – krati

+0

Эта регистрация отсутствует в этом коде. –

Смежные вопросы