Service作为Android四大组件之一可以在很多场合的应用中使用,比如播放音乐、文件下载和文件上传等等,以下通过简短的代码实现了Service的基本使用,以及与Activity界面通信等功能,代码有很详细的注释:
Activity类:
/**
* 注意:
* A、将需要在后台执行的任务定义在onStartCommand()方法中,因为Service在UI线程中工作,所以不适合用于耗时的工作,而是应该定义一个子线程;
* B、服务启动后,参数startId就是该服务的id号
* C、可以调用stopSelf()来停止服务
* D、服务器可以重复启动,但是,onCreate()只调用一次,onStartCommand()会调用多次。
* E、混合开发时:Started Service:负责执行任务,Bind Service:负责将服务的信息返回到Activity
* @author Administrator
*/
public class MainActivity extends Activity {
private static final String TAG = MainActivity.class.getSimpleName();//获得完整类名
private MyBind mBind;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
/**
* 启动start服务,不能接收到service返回的值(可通过广播实现传值)
* 启动:startService()
* 停止:stopSelf()、stopService()
* onCreate -> onStartCommand -> run -> onDestory
* @param v
*/
public void start(View v){
Intent intent = new Intent(StartedService.ACTION);//隐式启动
Bundle bundle = new Bundle();
intent.putExtra("1", "success"); //传值
this.startService(intent);
}
/**绑定bind服务,通过ServiceConnection接收Service返回的值
* Context.BIND_AUTO_CREATE 自动创建
* 启动:bindService()
* 停止:unbindService()
* onCrete -> onBind -> onUnbind -> onDestory
* @param v
*/
public void bind(View v){
Intent intent = new Intent(StartedService.ACTION);
intent.putExtra("name", "坚强"); //传值
this.bindService(intent, new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName arg0) {
//数据传递失败是调用
}
@Override
public void onServiceConnected(ComponentName arg0, IBinder arg1) {
mBind = (MyBind) arg1;
Log.e(TAG,mBind.getData()+"");
}
}, Context.BIND_AUTO_CREATE);
}
}
public class StartedService extends Service {
public static final String ACTION = StartedService.class.getName();//获得完整类名
private static final String TAG = StartedService.class.getSimpleName();//获得类名
private String s;
/**
* 数据处理内部类
* @author Administrator
*
*/
class MyBind extends Binder{
public String getData(){
return s;
}
}
@Override
public IBinder onBind(Intent arg0) {
Log.e(TAG, "onBind: "+arg0.getStringExtra("name"));//获得intent传过来的值(BindService)
return new MyBind();
}
@Override
public void onCreate() {
super.onCreate();
Log.e(TAG, "onCreate");
}
/**
* 任务执行类
* Service.START_REDELIVER_INTENT 如果服务被杀死,则自动重启
*/
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.e(TAG, "onStartCommand");
s = intent.getStringExtra("1");//获得intent传过来的值(startService)
doTask(s);//处理任务
return super.onStartCommand(intent, Service.START_REDELIVER_INTENT, startId);
}
/**
* 执行任务
*/
public void doTask(final String s){
new Thread(new Runnable() {
@Override
public void run() {
//Log.e(TAG, "数据接收成功: "+s);
new MyBind().getData();
stopSelf();//结束service
}
}).start();
}
}
配置文件:
<service android:name="com.example.mytest5.StartedService">
<intent-filter>
<action android:name="com.example.mytest5.StartedService"/>
</intent-filter>
</service>
项目源码地址:
http://download.csdn.net/detail/sunshine_mood/9417365
http://download.csdn.net/detail/sunshine_mood/9417479
测试图: