Как создать бесконечный сервис на Android, который прослушивает событие встряхивания? - PullRequest
0 голосов
/ 04 ноября 2018

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

Когда телефон встряхивается, отображается сообщение с тостом. Вот код для услуги:

public class MyService extends Service {

    private SensorManager sensorManager;

    private float accelerationValue;  //current acceleration value and gravity
    private float accelerationLast; //last acceleration value and gravity
    private float shake; //difference between acceleration value and gravity

    public MyService() {
    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        throw new UnsupportedOperationException("Not yet implemented");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // TODO Auto-generated method stub
        sensorManager=(SensorManager) getSystemService(Context.SENSOR_SERVICE);
        sensorManager.registerListener(sensorListener,sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),SensorManager.SENSOR_DELAY_NORMAL);

        accelerationValue=SensorManager.GRAVITY_EARTH;
        accelerationLast=SensorManager.GRAVITY_EARTH;
        shake=0.00f;
        return START_STICKY;
    }

    @Override
    public void onTaskRemoved(Intent rootIntent) {
        // TODO Auto-generated method stub
        Intent restartService = new Intent(getApplicationContext(),
                mainTest.class);
        restartService.setPackage(getPackageName());
        PendingIntent restartServicePI = PendingIntent.getService(
                getApplicationContext(), 1, restartService,
                PendingIntent.FLAG_ONE_SHOT);

        //Restart the service once it has been killed android


        AlarmManager alarmService = (AlarmManager)getApplicationContext().getSystemService(Context.ALARM_SERVICE);
        alarmService.set(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime() +100, restartServicePI);

    }

    @Override
    public void onCreate() {
        // TODO Auto-generated method stub
        super.onCreate();
        //start a separate thread and start listening to your network object
    }

    private final SensorEventListener sensorListener = new SensorEventListener() {

        @Override
        public void onSensorChanged(SensorEvent event) {

            float x= event.values[0];
            float y= event.values[1];
            float z= event.values[2];

            accelerationLast=accelerationValue;
            accelerationValue=(float) Math.sqrt((double)(x*x + y*y + z*z));
            float delta = accelerationValue-accelerationLast;
            shake = shake * 0.9f + delta;

            // getName=getIntent().getStringExtra("APP_CLASS_PATH");

            if(shake > 12){
               // Intent launchGoogleChrome=getPackageManager().getLaunchIntentForPackage(setName);
              //  startActivity(launchGoogleChrome);
                Toast.makeText(getApplicationContext(),"shaken",Toast.LENGTH_SHORT).show();
            }
        }

        @Override
        public void onAccuracyChanged(Sensor sensor, int accuracy) {

        }
    };

Я запускаю эту службу с помощью намерения, подобного так:
startService(new Intent(getBaseContext(),MyService.class));

...