Android START_NOT_STICKY无效

时间:2014-08-26 19:20:08

标签: android service restart

我正在尝试编写一个示例Android服务代码来测试服务是否在将START_NOT_STICKY返回到onStartCommand后停止。但我随时关闭我的应用程序,服务停止,而根据规则START_NOT_STICKY将不允许自动停止服务。

MyCode:

ServiceDemo.java

package com.example.servicedemo;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) 
{

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    Intent in = new Intent(this,TrackService.class);

    startService(in);


}}

TrackService.java

package com.example.servicedemo;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;

 public class TrackService extends Service
{

@Override
public IBinder onBind(Intent arg0) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public int onStartCommand(Intent intent, int flags , int startId)
{

    return START_NOT_STICKY;


}

@Override
public boolean onUnbind(Intent intent)
{

    return super.onUnbind(intent);

}}

这是我的上述代码,每当我关闭我的应用程序时,应用程序服务自行停止,请帮助我,我如何限制我的服务停止或重新启动。

3 个答案:

答案 0 :(得分:1)

  

关闭我的应用程序意味着,按住主页并从幻灯片菜单向上滑动应用程序以完全关闭

这意味着您要终止后台进程。此时,您的服务已经消失,而且由于您要返回START_NOT_STICKY,它将不会自动重启。

换句话说,正在发生的事情是完全正常的。

答案 1 :(得分:0)

使用滑动关闭不会终止此代码。

这是一个在前台运行的服务,因此android会将其视为在屏幕上。它在一个单独的过程中运行,因此可以杀死主进程。它会在用户运行时向用户显示一个自定义通知,以便完全连接并写入。

注意Eclipse ADK用户仅在完成调试后将服务放在不同的进程中。

清单

    <service
        android:name="com.gosylvester.bestrides.ServiceLocationRecorder"
           android:process=":myService" >
    </service>
 </application>

MyService类

private boolean isRecording = false;

public int onStartCommand(Intent intent, int flags, int startId) {
    boolean isTrackerMarker = SettingMarker.TRACKER_MARKER_DEFAULT;
    if (intent != null) {
        isRecording = intent.getBooleanExtra("isrecording", isRecording);
        startRecording(isRecording);
    }

    //if isRecording keep the service running else let os know service can be killed

    if (isRecording) {
        startForeground(R.id.action_record, getMyCustomNotification());
        return Service.START_STICKY;
    } else {
        stopForeground(true);
        return Service.START_NOT_STICKY;
    }
}

答案 2 :(得分:0)

重新创建服务 ,只是重新启动。 如果您覆盖onCreate并执行Log.d或Toast,您将看到在活动和应用程序被破坏甚至服务onDestroy被调用之后,onCreate会被调用。

因此重新创建后使其保持运行的诀窍是将代码置于onCreate方法上,并仅将onStartCommand用于{{1} }。

注意:onCreate在onStartCommand之前调用,因此您的代码在由startService启动时以及从系统自动创建时都将运行。