单击按钮我想使用方法startService(new Intent(currentActivity.this,MyService.class))
启动服务但是如果服务正在运行,我不想调用此方法来避免运行已经运行的服务。这是可能的。我是在同一个项目中同时使用意图服务和服务,并希望为这两个项目应用相同的条件。
答案 0 :(得分:75)
服务只会运行一次,因此您可以多次拨打startService(Intent)
。
您将在服务中收到onStartCommand()
。所以记住这一点。
来源:
请注意,对Context.startService()
的多次调用不会嵌套(尽管它们会导致对onStartCommand()
进行多次相应的调用),因此无论启动多少次,服务都会停止Context.stopService()
或stopSelf()
被召唤;但是,服务可以使用他们的stopSelf(int)
方法来确保在开始处理意图之前不会停止服务。
位于:http://developer.android.com/reference/android/app/Service.html主题:服务生命周期
答案 1 :(得分:19)
使用startService()
。
Start Service将致电onStartCommand()
如果服务尚未启动,则会致电onCreate()
。初始化变量和/或在onCreate()
中启动一个主题。
答案 2 :(得分:7)
绑定您的服务;开始通话时:
Intent bindIntent = new Intent(this,ServiceTask.class);
startService(bindIntent);
bindService(bindIntent,mConnection,0);
然后检查您的服务是否正常,请使用以下方法:
public static boolean isServiceRunning(String serviceClassName){
final ActivityManager activityManager = (ActivityManager)Application.getContext().getSystemService(Context.ACTIVITY_SERVICE);
final List<RunningServiceInfo> services = activityManager.getRunningServices(Integer.MAX_VALUE);
for (RunningServiceInfo runningServiceInfo : services) {
if (runningServiceInfo.service.getClassName().equals(serviceClassName)){
return true;
}
}
return false;
}
答案 3 :(得分:1)
每当我们从任何活动启动任何服务时,Android系统都会调用服务的onStartCommand()方法。如果服务尚未运行,系统首先调用onCreate(),然后调用onStartCommand()。
所以要说的是,android服务在其生命周期中只启动一次并保持运行直到停止。如果任何其他客户端想要再次启动它,则只会一直调用onStartCommand()方法。
答案 4 :(得分:0)
因此,为了避免一次又一次地重新启动任务,您可以使用布尔值,即任务已经开始或正在进行。将方法放在 oncreate 和 onstartCommand 中,并使用布尔值进行检查:
boolean isTimerTaskRunning = false;
private boolean isServiceKeepRunning(){
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this);
return settings.getBoolean("silentModeKeepRunning", true);
}
@Override
public void onCreate() {
super.onCreate();
Log.i(TAG, "onCreate: Called");
Log.i(TAG, "onCreate: keepRunning "+isServiceKeepRunning());
if(!isTimerTaskRunning) {
startTimerTask();
isTimerTaskRunning = true;
}
//startForeground(REQUEST_CODE /* ID of notification */, notificationbuilder().build());
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
localData = new LocalData(this);
// return super.onStartCommand(intent, flags, startId);
Log.i(TAG, "onStartCommand: Called");
Log.i(TAG, "onStartCommand: keepRunning "+isServiceKeepRunning());
Toast.makeText(this, "This is The Mode For Silent. ", Toast.LENGTH_LONG).show();
if(!isTimerTaskRunning) {
Log.i(TAG, "TimerTask was not Running - started from onStartCommand");
startTimerTask();
isTimerTaskRunning = true;
}else {
Log.i(TAG, "TimerTask was already Running - checked from onStartCommand");
}
//return START_REDELIVER_INTENT;
startForeground(REQUEST_CODE /* ID of notification */, notificationbuilder().build());
return START_STICKY;
}