service全面解析(一)
2016-05-30 19:52
525 查看
Service Android程序的四大组件之一,它与Activity极为相似,它具有自己的生命周期,不同的是它没有Activity 类似的交互界面不能和用户进行交互 Service运行在后台,它可以和一些组建(Activity)绑定进行本地通信,也可以跨进程通信(AIDL),接下来我们详细看看service的功能。 1:启动方式: Service的启动方式可以分为两种形式: 第一种只启动一个service,这时候service和启动它的组件之间就没有任何了 第二种通过bindService()方法启动一个service,它会将指定的Service和组件(Activity)关联起来,可以进行通信。
startService()方法启动的生命周期:
1.其他组件调用startService()方法:
2.onCreate()方法被调用,执行初始化
3.onStartCommand()方法触发。
3.调用stopService()方法,销毁service,onDestroy()方法触发
bindService()方式的生命周期:
1.其他组件调用bindService()方法
2.onCreate()方法被调用,执行初始化
3.onBind()方法被触发,并返回一个IBinder实现类的对象,这个对象在绑定的组件中获取,我们可以使用这个对象可以进行组件和service的通信
4.onUnBind()方法,在我们调用unBindService()的(解绑)时候触发
5.执行onDestroy()方法,销毁services
通过startService()方式启动方式相对简单,在此就不给例子演示了,下面我们来看下通过bindService()方式启动的一个例子
首先使用主界面布局文件service_main.XML
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:id="@+id/bt_start_service" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/start_service" /> <Button android:id="@+id/bt_stop_service" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/stop_service" /> <Button android:id="@+id/bt_bind_service" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/bind_service" /> </LinearLayout>
如图只有三个按钮,获取services的属性值,绑定启动,解绑,这个比较简单。
接下来我们定义一个ServiceActivity类让它继承Service类
public class ServiceTest extends Service { private String TAG = ServiceTest.class.getSimpleName(); private int count = -1; @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub Log.i(TAG, "-----onbind-----"); return new MyBinder(); } @Override public void onCreate() { super.onCreate(); Log.i(TAG, "----oncreate--"); count = 100; } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.i(TAG, "---onStartCommant----"); return super.onStartCommand(intent, flags, startId); } @Override public boolean onUnbind(Intent intent) { Log.i(TAG, "---------onunbinder()------"); count = -1; return true; } public class MyBinder extends Binder { public int getCount() { return count; } } @Override public void onDestroy() { Log.i(TAG, "---------ondestroy()------"); super.onDestroy(); } @Override public void onRebind(Intent intent) { // TODO Auto-generated method stub Log.i(TAG, "-----onRebind----"); super.onRebind(intent); } }
首先我们在每个回调的方法里里都打印一下,方便我们之后观察他们的执行次序,其次在onbind()方法中 返回了一个IBinder对象,我们继承了它的实现类Binder类实现了一个我自己的内部类Mybinder,MyBinder类里面有个一个方法返回了一个int 类型的count字段。 最后我们在一个Activity中绑定我们刚才的service组件
public class ServiceActivity extends Activity implements OnClickListener { private ServiceTest.MyBinder binder; Intent mintent; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.service_main); Button start_service_bt = (Button) findViewById(R.id.bt_start_service); Button stop_service_bt = (Button) findViewById(R.id.bt_stop_service); Button bind_service_bt = (Button) findViewById(R.id.bt_bind_service); start_service_bt.setOnClickListener(this); stop_service_bt.setOnClickListener(this); bind_service_bt.setOnClickListener(this); } @Override public void onClick(View v) { Intent intent = new Intent(); intent.setClass(this, ServiceTest.class); switch (v.getId()) { case R.id.bt_start_service: Log.i("---count----",binder.getCount()+""); break; case R.id.bt_stop_service: unbindService(connection); break; case R.id.bt_bind_service: bindService(intent, connection, Service.BIND_AUTO_CREATE); break; } } private ServiceConnection connection = new ServiceConnection() { @Override public void onServiceDisconnected(ComponentName name) { // TODO Auto-generated method stub Log.i("---------", "-------disConnection-------"); } @Override public void onServiceConnected(ComponentName name, IBinder service) { binder = (ServiceTest.MyBinder) service; } }; }
这个Activity中我们使用bindService()方式绑定一个Service
bindService(Intent service, ServiceConnection conn, int flags),需要三个参数:
Intent:需要绑定的目标service的Intent的对象
ServiceConnection:该对象监听访问者和Service的连接情况,连接成功的时候回调onServiceConnected(ComponentName name, IBinder service)方法,当与之关联的组件崩溃等问题退出时调用onServiceDisconnected(ComponentName name)方法
flags:绑定的时候是否自动创建Service
看看运行结果:
但我们启动东应用点击“绑定service”按钮,控制台输出:
我们点击”组件通讯”:
我们会发现我能能在Activity中获取Service中的值,就是说我们能狗调用service中的方法和属性进行通信。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories