
正文
服务 Service 基本介绍
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
Activity
public class MainActivity extends ListActivity {
private boolean flag;//是否开启线程
public static final String ACTION_TEST_SERVICE = "com.bqt.service.TEST_SERVICE";
private MyServiceConnection conn;
private IBinderInterface mIBinder;//之所以另外定义一个接口IBinderInterface,而不是直接用MyService.MyBinder,是为了使用统一接口访问,达到解耦、隐藏的目的
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
List<String> mData = new ArrayList<String>(Arrays.asList("开启一个线程,执行死循环操作", "关闭上面开启的所有线程",//
"startService方式开启服务", "stopService方式关闭服务", "bindService方式开启服务 ", "unbindService方式解除绑定服务",//
"startService启动服务后再bindService", "通过IBinder间接调用服务中的方法"));
ListAdapter mAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mData);
setListAdapter(mAdapter);
conn = new MyServiceConnection();
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
switch (position) {
case 0:
flag = true;
final long time = System.currentTimeMillis();//当前时间的毫秒值
Toast.makeText(MainActivity.this, "一个新的线程已开启……", Toast.LENGTH_SHORT).show();
new Thread(new Runnable() {
@Override
public void run() {
while (flag) {
Log.i("bqt", (System.currentTimeMillis() - time) / 1000 + "");//多少秒
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
break;
case 1:
flag = false;
Toast.makeText(MainActivity.this, "所有线程已关闭……", Toast.LENGTH_SHORT).show();
break;
case 2://startService方式开启服务。onCreate()--> onStartCommand() --->onDestory() 。onBind()方法并没有
startService(new Intent(this, MyService.class));//当调用者结束了自己的生命周期,但是只要没调用stopService,那么Service还是会继续运行
break;
case 3://stopService方式关闭服务。service不建议采用隐式方式启动,在高版本可能警告"不安全",更高版本可能直接异常退出
stopService(new Intent(ACTION_TEST_SERVICE));//服务只会被停止一次,但多次调用并不会异常
break;
case 4://绑定的方式开启服务 onCreate() --->onBind();--->onUnbind()-->onDestory() 绑定服务不会调用onStartCommand方法
bindService(new Intent(this, MyService.class), conn, BIND_AUTO_CREATE);//flags:绑定时如果Service还未创建是否自动创建;0:不自动创建;1:自动创建
break;
case 5:
unbindService(conn);//多次调用会异常!
mIBinder = null;//若不把mIBinder置为空,则服务销毁后仍然可以调用服务里的方法,因为内部类的引用还在
break;
case 6:
startService(new Intent(this, MyService.class));
//使用bindService来绑定一个【已启动】的Service时,系统只是将Service的内部IBinder对象传递给Activity,并不会将Service的生命周期与Activity绑定
bindService(new Intent(this, MyService.class), conn, BIND_AUTO_CREATE);//所以,此时调用unBindService方法取消绑定后,Service不会调用onDestroy方法
break;
case 7:
if (mIBinder != null) {
mIBinder.callMethodInService(100);
} else {
Toast.makeText(this, "还没有绑定呦……", Toast.LENGTH_SHORT).show();
}
break;
}
}
private class MyServiceConnection implements ServiceConnection {//Interface for monitoring监控 the state of an application service
@Override
/**此方法中的IBinder即为我们调用bindService方法时Service的onBind方法返回的对象,我们可以在此方法回调后通过这个IBinder与Service进行通信 */
public void onServiceConnected(ComponentName name, IBinder service) {//访问者与Service连接成功时回调
//Called when a connection连接 to the Service has been established确定、已建立, with the IBinder of the communication channel to the Service.
mIBinder = (IBinderInterface) service;
Toast.makeText(MainActivity.this, "服务已连接……", Toast.LENGTH_SHORT).show();
}
@Override
public void onServiceDisconnected(ComponentName name) {//异常终止或者其他原因终止导致Service与访问者断开连接时回调
Toast.makeText(MainActivity.this, "服务已断开连接……", Toast.LENGTH_SHORT).show();
}
}
}Service
public class MyService extends Service {
@Override
public void onCreate() {
Log.i("bqt", "onCreate");
super.onCreate();
}
@Override
public IBinder onBind(Intent intent) {//如果再次使用bindService绑定Service,系统不会再调用onBind()方法,而是直接把IBinder对象传递给其他后来增加的客户端
Log.i("bqt", "onBind");
return new MyBinder();//当访问者通过bindService方法与Service连接成功后,系统会将此返回的IBinder接口类型对象,通过bindService中的参数ServiceConnection对象的onServiceConnected方法,传递给访问者,访问者通过该对象便可以与Service组件进行通信
}
@Override
public void onRebind(Intent intent) {
super.onRebind(intent);
Log.i("bqt", "onRebind");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {//客户端每次调用startService方法时都会回调此方法;调用bindService时不会回调此方法
Log.i("bqt", "onStartCommand");
return super.onStartCommand(intent, flags, startId);
}
@Override
public boolean onUnbind(Intent intent) {//绑定多客户端情况下,需要解除所有的绑定后才会(就会)调用onDestoryed方法,除非service也被startService()方法开启
Log.i("bqt", "onUnbind");
return super.onUnbind(intent);
}
@Override
public void onDestroy() {
Log.i("bqt", "onDestroy");
super.onDestroy();
}
//******************************************************************************************
/**这是服务里面的一个方法,对外是隐藏的,只能通过IBinder间接访问*/
private void methodInService() {
Toast.makeText(this, "服务里的方法被调用了……", Toast.LENGTH_SHORT).show();
}
private class MyBinder extends Binder implements IBinderInterface {//须实现IBinder接口或继承Binder类。对外是隐藏的。
public void callMethodInService(int money) {
if (money > 0) {
methodInService();//间接调用了服务中的方法
}
}
}
}联系Activity和Service的中间接口
public interface IBinderInterface {
public void callMethodInService(int money);
}清单文件
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.bqt.service"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
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 android:name=".MyService" >
<intent-filter>
<action android:name="com.bqt.service.TEST_SERVICE" />
</intent-filter>
</service>
</application>
</manifest>来自为知笔记(Wiz)







