Android Service基本知识总结(一)

发布时间:2017-7-1 11:29:03编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"Android Service基本知识总结(一) ",主要涉及到Android Service基本知识总结(一) 方面的内容,对于Android Service基本知识总结(一) 感兴趣的同学可以参考一下。

二、生命周期

创建MyService extends Service

清单文件中注册:

<service android:name=".MyService"/>

两种启动方式:

1.startService(Intent service) 

1.调用startService()启动MyService,

  Intent startIntent=new Intent(this,MyService.class);
  startService(startIntent);
2.多次调用startService并不会多次执行MySercice中的onCreate()方法,会多次执行onStartCommand()方法
3.调用stopService()销毁MyService
  Intent stopIntent=new Intent(this,MyService.class);
  stopService(stopIntent);

2.bindService(Intent service, ServiceConnection conn,int flags)

1.调用startService()启动MyService,
Intent startIntent=new Intent(this,MyService.class);
startService(startIntent);
2.多次调用startService并不会多次执行MySercice中的onCreate()方法,会多次执行onStartCommand()方法
3.调用stopService()销毁MyService
Intent stopIntent=new Intent(this,MyService.class);
stopService(stopIntent);


bindService(Intent service, ServiceConnection conn,int flags)
1)在MyService中创建并声明MyBinder ,MyBinder中封装可能会执行的任务
  private MyBinder mBinder=new MyBinder();

  

class MyBinder extends Binder {        public void downLoad(){            Log.e(TAG, "downLoad: " );            new Thread(new Runnable() {                @Override                public void run() {                    // 执行具体的下载任务                }            }).start();        }    }

2)声明ServiceConnection,并在onServiceConnected中获取MyService.MyBinder

  

 private ServiceConnection connection=new ServiceConnection() {        //activity和service创建连接时调用        @Override        public void onServiceConnected(ComponentName name, IBinder service) {            Log.e(TAG, "onServiceConnected: " );            //这里可以获取myBinder  通过myBinder里的方法 和service交互            myBinder= (MyService.MyBinder) service;            myBinder.downLoad();        }        //unbind()调用时不会调用此方法  不是解除关联的时候调用,而是发生异常时调用的        @Override        public void onServiceDisconnected(ComponentName name) {            Log.e(TAG, "onServiceDisconnected: " );        }    };

3)在MyService的onBind()方法中返回mBinder;

  

@Override    public IBinder onBind(Intent intent) {        Log.e(TAG, "onBind: " );        return mBinder;    }

4)调用onBind()绑定Service和Activity,启动MyService

  

Intent bindIntent = new Intent(this, MyService.class);                bindService(bindIntent, connection, BIND_AUTO_CREATE);

5)调用 unbindService(connection) 销毁MyService

unbindService(connection);

在activty中拿到mBinder后,就可以进行activity和service之间的交互了。

若一个Service先通过startService启动 再通过bindService启动。单独stopService()或者unbindService()都不能销毁Service,先stopService(),再unBindService()销毁MyService。

6)注意事项

  1.Service是运行在主线程中的,不能直接执行耗时操作。可以在Service中创建一个子线程进行耗时操作

  2.既然要在Service里也创建一个子线程,那为什么不直接在Activity里创建呢?

  这是因为Activity很难对Thread进行控制,当Activity被销毁之后,就没有任何其它的办法可以再重新获取到之前创建的子线程的实例。

而且在一个Activity中创建的子线程,另一个Activity无法对其进行操作。但是Service就不同了,所有的Activity都可以与Service进行关联,
然后可以很方便地操作其中的方法,即使Activity被销毁了,之后只要重新与Service建立关联,就又能够获取到原有的Service中Binder的实例。

  3.标准的Service常用格式:

  

@Override  public int onStartCommand(Intent intent, int flags, int startId) {      new Thread(new Runnable() {          @Override          public void run() {              // 开始执行后台任务          }      }).start();      return super.onStartCommand(intent, flags, startId);  }    class MyBinder extends Binder {        public void startDownload() {          new Thread(new Runnable() {              @Override              public void run() {                  // 执行具体的下载任务              }          }).start();      }    }  

 三、代码

 

  1.MyService

public class MyService extends Service {    private String TAG="333";    private MyBinder mBinder=new MyBinder();    @Override    public void onCreate() {        super.onCreate();        Log.e(TAG, "onCreate: " );    }    @Override    public int onStartCommand(Intent intent,  int flags, int startId) {        Log.e(TAG, "onStartCommand: " );        new Thread(new Runnable() {            @Override            public void run() {                // 开始执行后台任务            }        }).start();        return super.onStartCommand(intent, flags, startId);    }    @Nullable    @Override    public IBinder onBind(Intent intent) {        Log.e(TAG, "onBind: " );        return mBinder;    }    @Override    public void onDestroy() {        Log.e(TAG, "onDestroy: " );        super.onDestroy();    }    class MyBinder extends Binder {        public void downLoad(){            Log.e(TAG, "downLoad: " );            new Thread(new Runnable() {                @Override                public void run() {                    // 执行具体的下载任务                }


上一篇:MYSQL分段统计
下一篇:json的键为变量而不是字符串时,怎么写?

相关文章

相关评论

本站评论功能暂时取消,后续此功能例行通知。

一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!

二、互相尊重,对自己的言论和行为负责。

好贷网好贷款