启动的方式:
(1)startService():调用者和服务之间没有联系,即使调用者退出了,服务仍然进行[onCreate()->onStartCommand()->startService()->onDestory()],主要用于启动一个服务执行后台任务,Service和访问者之间不进行通信、数据交换,停止服务使用stopService(),希望Service组件做某些事情,可以在onCreate或onStartCommand方法中定义相关业务代码。
onStartCommand返回值是int类型的,只能有三种:
- START_STICKY:当服务进行在运行时被杀死,系统会把它置为started状态,但是并不保存其传递的Intent对象
- START_NOT_STICKY:当服务进行在运行时被杀死,并且没有新的Intent对象传递过来,系统会把它置为started状态,但是并不会再次创建进程,直到startService(Intent)方法被调用。
- START_REDELIVER_INTENT:当服务进行在运行时被杀死,它将会间隔一段时间后重新被创建,并且最后一个传递的Intent对象将会再次传递过来。
(2)bindService():调用者和服务绑在一起,调用者一旦退出,服务也就终止[onCreate()—>onBlind()—>onUnbind()—>onDestory()],该方法启动的服务和访问者之间可以进行通信或数据交换,停止服务使用unbindService。
bindService()方法的完整形式是:bindService(Intent service, ServiceConnection conn, int flags)三个参数解释如下:
- service:该参数通过Intent指定要启动的Service。
- coon:该参数是一个ServiceConnection对象,该对象用于监听访问者与Service之间的连接情况。当访问者与Service之间连接成功时将回调该ServiceConnection对象的onServiceConnected(ComponentName name,IBinder service)方法;当访问者与Service之间由于某种意外断开连接时将回调ServiceConnection对象的onServiceDisconnected(ComponentName name)方法,一般断开调用unbind(),不回调onServiceDisconnected
- flags:指绑定时是否自动创建Service(如果Service还未创建)。该参数可指定为0(不自动创建)或为BIND_AUTO_CREATE
下面介绍startService()启动service:
(1)创建一个服务Service:
package com.syz.startservice;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;
public class Myservice extends Service {
private static final String TAG = "Myservice";
@Override
public void onCreate() {
Log.i(TAG, "Myservice-->onCreate()");
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i(TAG, "Myservice-->onStartCommand()");
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
Log.i(TAG, "Myservice-->onDestroy()");
super.onDestroy();
}
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
}
(2)在Activity的布局文件中创建两个Button分别表示:启动Service和终止Service
<Button
android:id="@+id/StartService"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world"
/>
<Button
android:id="@+id/StopService"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world1"
/>
(3)在Activity中调用Service:
package com.syz.startservice;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity {
private Button StartService=null;
private Button StoptService=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
StartService=(Button)findViewById(R.id.StartService);
StoptService=(Button)findViewById(R.id.StopService);
StartService.setOnClickListener(listener); //设置监听
StoptService.setOnClickListener(listener);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
private OnClickListener listener =new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent =new Intent();
intent.setClass(MainActivity.this, Myservice.class);
switch (v.getId()) { //用于判断按钮是哪一个按下,从而决定是启动还是终止服务
case R.id.StartService:
startService(intent);
break;
case R.id.StopService:
stopService(intent);
break;
default:
break;
}
}
};
}
(4)在AdroidMainfest.xml中注册MyService:
<service
android:name="com.syz.startservice.Myservice">
</service>
其中<service
</service>与<activity
</activity>平级