Android之Service
来源:互联网 发布:数据结构设计怎么写 编辑:程序博客网 时间:2024/06/05 11:59
简介:
基本概念:Service是Android四大组件之一,运行在后台执行耗时操作并且不提供用户界面。其他组件(如Activity)可以通过startService启动该组件,也可以通过bindService启动并绑定该组件进行通信。
使用场景:后台下载文件,播放音乐等。
注意:Service运行在主线程中,它不会创建属于自己的线程,也不是运行在独立的线程中,所以,在使用的时候,需要自己创建线程,而不应该直接执行耗时操作,这样会引起ANR(程序未响应)错误。
Service的两种形式:
Started Service
基本概念:其他组件(如Activity)通过调用startService()启动该Service。拥有独立的生命周期,不依赖启动它的组件。
Bound Service
基本概念:其他组件为了与Service建立一个长时间的连接,通过调bindService启动并绑定该Service。并能与之交互(发送请求,接受响应)。生命周期依赖绑定它的组件,可以是多个组件绑定同一个Service,一旦所有绑定它的组件取消绑定,则消亡。
Service的生命周期:
Started Service,Bound Service生命周期方法流程:
以下示例代码包含两个子Demo,所以第一个界面里面包含两个ListViewItem,分别可以进入这两个子Demo:
- public class MainActivity extends Activity {
- private String[] datas = { "Started Service Demo", "Bound Service Demo" };
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- setupViews();
- }
- private void setupViews() {
- //新建一个数组适配器
- ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(
- MainActivity.this, android.R.layout.simple_list_item_1, datas);
- //获取到ListView控件
- ListView mListView = (ListView) findViewById(R.id.list_view_main);
- //为ListView设置适配器
- mListView.setAdapter(arrayAdapter);
- //为ListView Item设置点击监听器
- mListView.setOnItemClickListener(new OnItemClickListener() {
- @Override
- public void onItemClick(AdapterView<?> parent, View view,
- int position, long id) {
- switch (position) {
- case 0:
- //跳转到Started Service Demo Activity
- redirectTOActivity(StartedServiceDemoActivity.class);
- break;
- case 1:
- //跳转到Bound Service Demo Activity
- redirectTOActivity(BoundServiceDemoActivity.class);
- break;
- default:
- break;
- }
- }
- });
- }
- //跳转到其他Activity
- private void redirectTOActivity(Class<?> destination){
- Intent intent = new Intent(MainActivity.this, destination);
- startActivity(intent);
- }
- }
以下是用StartService方法启动Service的Activity:
- //操作Servie01的Activity
- public class StartedServiceDemoActivity extends Activity implements OnClickListener{
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_started_service_demo);
- setupViews();
- }
- private void setupViews() {
- //设置两个按钮的监听器为当前Activity
- findViewById(R.id.button01).setOnClickListener(this);
- findViewById(R.id.button02).setOnClickListener(this);
- }
- @Override
- public void onClick(View v) {
- Intent intent = new Intent(StartedServiceDemoActivity.this, Service01.class);
- int id = v.getId();
- switch (id) {
- case R.id.button01:
- //Start Service按钮被点击
- //启动Service01
- startService(intent);
- break;
- case R.id.button02:
- //Stop Service按钮被点击
- //停止Service01
- stopService(intent);
- break;
- default:
- break;
- }
- }
- }
以下是Service01的内容,它的onBind()和onUnBInd()不会被回调:
- /**
- *
- * Service01是以StartService方式启动,以StopService方式停止的Service
- * 如果当前无Service01实例,那么回调方法onCreate()、onStartCommand()、onStart()方法会被依次调用
- * 如果当前有Service01实例,那么回调方法onStartCommand()、onStart()方法会被依次调用
- *
- */
- public class Service01 extends Service{
- @Override
- public IBinder onBind(Intent intent) {
- System.out.println("Service01 onBind.....");
- return null;
- }
- @Override
- public void unbindService(ServiceConnection conn) {
- System.out.println("Service01 onUnBind.....");
- super.unbindService(conn);
- }
- @Override
- public void onCreate() {
- System.out.println("Service01 onCreate.....");
- super.onCreate();
- }
- @Override
- public int onStartCommand(Intent intent, int flags, int startId) {
- System.out.println("Service01 onStartCommand.....");
- return super.onStartCommand(intent, flags, startId);
- }
- @Override
- public void onStart(Intent intent, int startId) {
- System.out.println("Service01 onStart.....");
- }
- @Override
- public void onDestroy() {
- System.out.println("Service01 onDestroy.....");
- super.onDestroy();
- }
- }
以下是用BindService方式启动Service的Activity:
- public class BoundServiceDemoActivity extends Activity implements OnClickListener {
- //实例化一个ServiceConnection的匿名子类对象
- private ServiceConnection serviceConnection = new ServiceConnection() {
- @Override
- public void onServiceDisconnected(ComponentName name) {
- //当解除绑定事件发生时,此方法被回调
- isBind = false;
- }
- @Override
- public void onServiceConnected(ComponentName name, IBinder service) {
- //当绑定事件发生时,此方法被回调
- MyBinder myBinder = (MyBinder) service; //进行一个类型转换,得到MyBinder实例
- //得到Service02实例
- mService = myBinder.getService();
- isBind = true;
- }
- };
- //定义一个Servie02类型的实例
- private Service02 mService = null;
- //定义一个bool变量,记录当前Activity是否绑定了Servie02
- private boolean isBind = false;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_bound_service_demo);
- setupViews();
- }
- private void setupViews(){
- findViewById(R.id.button01).setOnClickListener(this);
- findViewById(R.id.button02).setOnClickListener(this);
- findViewById(R.id.button03).setOnClickListener(this);
- }
- @Override
- public void onClick(View v) {
- Intent intent = new Intent(BoundServiceDemoActivity.this, Service02.class);
- int id = v.getId();
- switch (id) {
- case R.id.button01:
- //开始绑定
- bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);
- break;
- case R.id.button02:
- //调用Service02的业务方法
- if(mService != null){
- int x = mService.getRandomNumber();
- Toast.makeText(BoundServiceDemoActivity.this, "" + x, Toast.LENGTH_SHORT).show();
- }
- break;
- case R.id.button03:
- //解除当前Activity与Service02之间的绑定关系
- unbindService(serviceConnection);
- break;
- default:
- break;
- }
- }
- }
以下是Service02的内容,它的onStart()和onStartCommand()方法不会被回调,
这种Service它一般去编写的时候分为四个步骤,必须要有一个Binder实例来传递Service实例,具体如下:
- /**
- *
- * Service02是以BindService方式启动,以UnBindService方式解绑Service与组件之间的绑定关系,
- * 如果Service02已经绑定启动了,可以有其他的多个Activity通过BindService方式继续与其绑定,只有
- * 当所有的Activity都与Service02解除绑定关系,Service02实例才消亡
- *
- * 如果当前无Service02实例,那么回调方法onCreate()、onBind()方法会被依次调用
- * 如果当前有Service02实例,那么回调方法onBind()方法会被依次调用
- * 如果所有绑定Service02实例的组件都调用UnBind方法,那么回调方法onUnbind()、onDestroy()方法会依次被调用
- *
- */
- public class Service02 extends Service {
- // 第一步,定义一个Binder类型的子类,在子类种定义一个getService方法
- public class MyBinder extends Binder {
- public Service02 getService() {
- return Service02.this;
- }
- }
- //第二步,定义一个MyBinder类型的实例
- private MyBinder mBinder = new MyBinder();
- @Override
- public void onStart(Intent intent, int startId) {
- System.out.println("Service02 onStart.....");
- super.onStart(intent, startId);
- }
- @Override
- public int onStartCommand(Intent intent, int flags, int startId) {
- System.out.println("Service02 onStartCommand.....");
- return super.onStartCommand(intent, flags, startId);
- }
- @Override
- public void onCreate() {
- System.out.println("Service02 onCreate.....");
- super.onCreate();
- }
- @Override
- public IBinder onBind(Intent intent) {
- System.out.println("Service02 onBind.....");
- //第三步,在onBind方法中,返回MyBinder的实例
- return mBinder;
- }
- @Override
- public boolean onUnbind(Intent intent) {
- System.out.println("Service02 onUnBind.....");
- return super.onUnbind(intent);
- }
- @Override
- public void onDestroy() {
- System.out.println("Service02 onDestroy.....");
- super.onDestroy();
- }
- //第四步,在Service02中定义一个业务方法,让外面与当前Service02绑定的组件能够调用此方法,来完成既定目标
- public int getRandomNumber(){
- return new Random().nextInt(100);
- }
- }
最后把整个Demo的Android工程压缩文件链接如下:
Android Service Demo
- android Service 之Bound Service
- Android Service 之Bound Service
- android Service 之Bound Service
- android Service 之Bound Service
- Android之Service相关
- Android基本之Service
- Android 之 service
- Android学习之Service
- Android Service 之 AIDL
- android之Service
- android组件之Service
- Android学习之Service
- Android之service
- Android之Service
- Android基础之Service
- Android之Service&BroadCastReceiver
- 浅谈android 之 service
- android之Service
- Runtime--Selector、IMP、Method
- React-Native的基本控件属性方法 对React-Native的学习,从熟悉基本控件开始。
- git初探(2)
- ArcObjects中的IGeometry转成Json
- 把arguments转换为数组
- Android之Service
- 使用Git来部署线上代码
- 英语学习的一点东西
- Python创建虚拟环境
- 五子棋(人机)-alpha-beta剪枝
- Android之BroadcastReceiver
- npm install出错
- python实现多线程压测post接口服务
- hive和hadoop的dos操作语句