如果已经运行android,如何防止服务再次运行

时间:2012-05-24 14:23:38

标签: android service android-service

单击按钮我想使用方法startService(new Intent(currentActivity.this,MyService.class))启动服务但是如果服务正在运行,我不想调用此方法来避免运行已经运行的服务。这是可能的。我是在同一个项目中同时使用意图服务服务,并希望为这两个项目应用相同的条件。

5 个答案:

答案 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;
}