一、服务的简单介绍
快速入门service,因为就对概念不做太多介绍
一句话说明service用途,比如我们点击一首歌,activity展示歌词,播放时间等等,而后台则通过service来控制歌曲播放的各种事务(停止,下一首等等)
直接上demo
二、activity调用服务的两种方式
2.1 startService方式
布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="service demo"
/>
<LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="开启服务"
android:id="@+id/startBt"
>
</Button>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="关闭服务"
android:id="@+id/stopBt"
>
</Button>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="组件退出"
android:id="@+id/exitBt"
>
</Button>
</LinearLayout>
</LinearLayout>
activity
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
startBt = (Button) findViewById(R.id.startBt);
stopBt = (Button) findViewById(R.id.stopBt);
exitBt = (Button) findViewById(R.id.exitBt);
final Intent intent = new Intent();
intent.setAction("com.lwx.service.MYSERVICE");
startBt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
// 启动Service
startService(intent);
}
});
stopBt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
// 停止Service
stopService(intent);
}
});
exitBt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
// 关闭组件 但是服务没有关闭
// 通过bindService可以实现两者动作一致
ServiceActivity.this.finish();
}
});
}
service代码
/**
* @author draem0507
* @TODO <p>
* 自定义服务 继承service 重写onBind方法
* </p>
* <p>
* 需要在Mainfest.xml中配置
* </p>
* @version 1.0
* @date 2012 下午04:49:01
*/
public class MyService extends Service {
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
@Override
public void onCreate() {
// TODO Auto-generated method stub
Log.e("服务--", "onCreate");
super.onCreate();
}
@Override
public void onDestroy() {
Log.e("服务--", "onDestroy");
super.onDestroy();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.e("服务--", "onStart");
return super.onStartCommand(intent, flags, startId);
}
}
AndroidManifest.xml中配置
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".ServiceActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- 配置service 组件 -->
<service android:name=".MyService">
<intent-filter >
<action android:name="com.lwx.service.MYSERVICE" />
</intent-filter>
</service>
</application>
2.2 onbind方式
布局省略,大同小异
service代码
private MyBinder binder = new MyBinder();
private boolean quit;
private int count;
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return binder;
}
public class MyBinder extends Binder {
public int getCount() {
return count;
}
}
// 创建服务时候调用
@Override
public void onCreate() {
Log.e("", "创建连接--create");
new Thread() {
@Override
public void run() {
while (!quit) {
try {
sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
count++;
Log.e("count==", "" + count);
}
}
}.start();
super.onCreate();
}
// 销毁服务时候调用
@Override
public void onDestroy() {
quit = true;
count = 0;
Log.e("", "销毁连接--destroy");
super.onDestroy();
}
// 失去连接服务时候调用
@Override
public boolean onUnbind(Intent intent) {
// TODO Auto-generated method stub
Log.e("", "失去连接--unbind");
return super.onUnbind(intent);
}
activity代码
private MyService.MyBinder binder;
private final Intent intent = new Intent();
// 通过服务连接来打通service跟activity之间数据传输
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
System.out.println("onServiceDisconnected");
//binder = null;
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
System.out.println("onServiceConnected");
binder = (MyBinder) service;
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// http://tech.it168.com/a2012/0207/1307/000001307969.shtml
bindBt = (Button) findViewById(R.id.bindBt);
unbindBt = (Button) findViewById(R.id.unbindBt);
exitBt = (Button) findViewById(R.id.exitBt);
resultBt = (Button) findViewById(R.id.resultBt);
intent.setAction("com.lwx.service.MYSERVICE");
bindBt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Log.e("", "绑定服务连接");
bindService(intent, connection, Service.BIND_AUTO_CREATE);// 0不自动创建服务
}
});
resultBt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(ServiceActivity.this, "结果是:"+binder.getCount(), Toast.LENGTH_LONG).show();
}
});
unbindBt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
unbindService(connection);
}
});
exitBt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
//退出组件 自动触发服务的unbind和ondestroy方法
finish();
}
});
}
总结:要创建一个服务对象,则类似Activity类似,需要继承Service.同时在AndroidManifest.xml 做相应的定义
接着,通过intent.setAction来跳转。至于如何创建service则有两种方式。start和bind方式。