您的位置:首页 > 移动开发 > Android开发

Android初学习 - Service 中的 onStart 和 onStartCommand

2016-04-20 14:14 405 查看
在自定义的service中,写了onStart和onStartCommand,

public class HttpWebService extends Service {


@Override

public void onCreate() {

super.onCreate();
 
....

@Override
public void onStart(Intent intent, int startId) {
// this will trigger AbstractBackgroundService.onStart()
super.onStart(intent, startId);
Log.d(LOG_TAG, "onStart" + intent);
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
int retVal = super.onStartCommand(intent, flags, startId);
Log.d(LOG_TAG, "onStartCommand" + intent);

return retVal;
}

}


 

如果用 bindService 这种方式调用,onStart和onStartCommand都不会被调用到

this.bindService(new Intent(this, HttpWebService.class),
new ServiceConnection() {

@Override
public void onServiceConnected(ComponentName name,
IBinder service) {
HttpWebService webService = ((HttpWebService.LocalBinder) service)
.getService();
webService.SetServerListener(webListener);
}

@Override
public void onServiceDisconnected(ComponentName name) {

}
}, Context.BIND_AUTO_CREATE);


如果是用StartService调用,两个都被调用到

Intent intent = new Intent("com.example.sharefiles.services.ShareServices.Test");
intent.setClass(getApplicationContext(), HttpWebService.class);
intent.putExtra("enable", true);

this.startService(intent);


 

查看google 文档
http://developer.android.com/reference/android/app/Service.html 
onStart(Intent intent,
int startId)

This method was deprecated in API level 5. Implement 
onStartCommand(Intent,
int, int)
 instead.

onStartCommand(Intent intent,
int flags, int startId)

Called by the system every time a client explicitly starts the service by calling 
startService(Intent)
,
providing the arguments it supplied and a unique integer token representing the start request.

鉴于目前的代码基本都是运行在API5 以上的,所以直接干掉onStart.

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Android开发的过程中,每次调用startService(Intent)的时候,都会调用该Service对象的onStartCommand(Intent,int,int)方法,然后在onStartCommand方法中做一些处理。然后我们注意到这个函数有一个int的返回值,这篇文章就是简单地讲讲int返回值的作用。

从Android官方文档中,我们知道onStartCommand有4种返回值:

START_STICKY:如果service进程被kill掉,保留service的状态为开始状态,但不保留递送的intent对象。随后系统会尝试重新创建service,由于服务状态为开始状态,所以创建服务后一定会调用onStartCommand(Intent,int,int)方法。如果在此期间没有任何启动命令被传递到service,那么参数Intent将为null。

START_NOT_STICKY:“非粘性的”。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统不会自动重启该服务。

START_REDELIVER_INTENT:重传Intent。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统会自动重启该服务,并将Intent的值传入。

START_STICKY_COMPATIBILITY:START_STICKY的兼容版本,但不保证服务被kill后一定能重启。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: