此服务会导致设备在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);
}
}
我已尝试使用值onStartComand
和return START_STICK
的{{1}}方法,但它会不断重启或立即终止。
即使应用程序已从最近的应用程序中删除,我希望它继续停止。有没有办法做到这一点?
答案 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
}
}