活动结束时重新启动服务

时间:2017-06-09 23:34:52

标签: java android

此服务会导致设备在10秒后振动,但当活动关闭或应用程序从最近的应用程序中删除时,服务将重新启动。

public class Vibrar extends Service {

    @Override
    public IBinder onBind(Intent p1) {
        // TODO: Implement this method
        return null;
    }

    int delay = 10000; //milliseconds

    @Override
    public void onCreate() {
        // TODO: Implement this method
        Toast.makeText(getApplicationContext(),"created",Toast.LENGTH_SHORT).show();
        super.onCreate();
        Vibrar();
    }

    public void Vibrar() {
        new Handler().postDelayed(new Runnable() {
            public void run() {
                Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
                v.vibrate(200);
            }
        }, delay);
    }
}

我已尝试使用值onStartComandreturn START_STICK的{​​{1}}方法,但它会不断重启或立即终止。

即使应用程序已从最近的应用程序中删除,我希望它继续停止。有没有办法做到这一点?

3 个答案:

答案 0 :(得分:2)

我见过许多程序员使用匿名处理程序的错误。

使用此:

    Handler handler = new Handler();
    Runnable runnable = new Runnable() {
        @Override
        public void run() {
            if(System.currentMillis() - getLastVibrationTime() > delay){
                Vibrator v = (Vibrator)getSystemService(Context.VIBRATOR_SERVICE);
                v.vibrate(200);
                saveVibrationTime();
            }
        }
    };
    handler.postDelayed(runnable,10000);

在Destroy:

handler.removeCallbacks(runnable);

这将确保当您退出应用程序或服务时,处理程序也会被取消。

希望这有帮助。

答案 1 :(得分:0)

您需要启动和停止服务。

启动服务:

Intent intent_current = new Intent(activity,Vibrar.class);
activity.startService(intent_current);

当你需要它停止时:

Intent intent_current = new Intent(activity,Vibrar.class);
activity.stopService(intent_current);

重要提示:您的服务将像独立活动一样运行,因此您需要确保停止服务,否则它将继续运行,直到您的内存不足为止。  你应该看看Activity life cycle

答案 2 :(得分:0)

您是否尝试过使用闹钟管理器?它的主要目的是调度事件,以便它适合您的问题。 https://developer.android.com/training/scheduling/alarms.html请查看此链接。

如果这不能解决您的解决方案,我会为您提供另一种解决方案,即将上次振动时间保存到内部存储器中,并以节省的时间检查当前时间。

public class Vibrar extends Service {
    private static final String TIME_KEY = "lastinsertedtime";
    @Override
    public IBinder onBind(Intent p1) {
        // TODO: Implement this method
        return null;
    }

    int delay = 10000; //milliseconds

    @Override
    public void onCreate() {
        // TODO: Implement this method
        Toast.makeText(getApplicationContext(),"created",Toast.LENGTH_SHORT).show();
        super.onCreate();
        Vibrar();
    }
    public long getLastVibrationTime(){
        SharedPreferences preferences = getApplicationContext().getSharedPreferences("INTERNAL_STORAGE_NAME",Context.MODE_PRIVATE);
        return Long.parseLong(preferences.getString(TIME_KEY,"0"));
    }
    public void saveVibrationTime(){
        SharedPreferences preferences = getApplicationContext().getSharedPreferences("INTERNAL_STORAGE_NAME",Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = preferences.edit();
        editor.putString(TIME_KEY,String.valueOf(System.currentMillis()));
        editor.commit();
    }
    public void Vibrar() {
        new Handler().postDelayed(new Runnable() {
            public void run() {
                if(System.currentMillis() - getLastVibrationTime() > delay){
                     Vibrator v = (Vibrator)getSystemService(Context.VIBRATOR_SERVICE);
                     v.vibrate(200);
                     saveVibrationTime();
                }

            }
        }, 100);// check it for 100 ms
    }
}
相关问题