Android Service基础详讲
2016-04-26 17:46
399 查看
欢迎转载,转载请标明出处,谢谢^_^
Service是Android四大组件之一(其它三个:Activity,Content Provider内容提供者,BroadcastReceiver广播接收器)。接下来仔细介绍下Service的理论及使用。
1、Service的种类:
a:本地服务(Local) :该服务依附在主进程上
b:远程服务(Remote):该服务是独立的进程
也分前台服务(会在通知一栏显示 ONGOING 的 Notification)和后台服务(默认的服务即为后台服务,即不会在通知一栏显示 ONGOING 的 Notification)
2、Service的生命周期
当采用startService方式启动Service时,生命周期方法执行的顺序为:onCreate()–>onStartCommand()–>onDestory()。
当采用bindService方式启动Service时,生命周期方法执行的顺序为:onCreate()–>onBind()–>onUnBind()–>onDestory()。
3、Service的启动
1:想要用启动服务,首先得在 Androidmanifest.xml 中注册 service。即在
<application></application>节点中添加(由于要填写用户自定义的Service所在位置,可在创建完Service后再配置,提前写出来只是提醒,免得忘记):
<service android:name=".service.MyService"/>
Service其它基本项的配置:
android:name ————- 服务类名
android:label ————– 服务的名字,如果此项不设置,那么默认显示的服务名则为类名
android:icon ————– 服务的图标
android:permission ——- 申明此服务的权限,这意味着只有提供了该权限的应用才能控制或连接此服务
android:process ———- 表示该服务是否运行在另外一个进程,如果设置了此项,那么将会在包名后面加上这段字符串表示另一进程的名字
android:enabled ———- 如果此项设置为 true,那么 Service
将会默认被系统启动,不设置默认此项为 false
android:exported ——— 表示该服务是否能够被其他应用程序所控制或连接,不设置默认此项为 false
2:创建Service:
启动Service有两种方式:
startService()和
bindService(),两种方法都有对应自己的停止服务的方法:
stopService()和
unbindService()。不管使用哪种方式,创建Service时都需要重写相同的方法,只不过bind方式需要返回
IBinder对象用来与activity的通信,如果只是通过
startService()的话,就无需返回,系统默认返回
null。
如果开启服务既用了
startService()也用了
bindService()(即在接下来的例子中即点击了”开启service”按钮,又点击了”绑定activity”按钮),那么想要停止服务的话需要同时执行:
stopService()和
unbindService()(即既要点击”解除绑定activity”按钮,也要点击”关闭service”按钮)不然将无法停止服务。
接下来的例子综合两种方式。
启动Service的方法和启动Activity很类似,都需要借助Intent来实现,并且需要重写onCreate等方法,看一下具体的例子:
4、Service的实例
新建项目,自定义类MyService继承 Service ,并重写方法:
public class MyService extends Service { //自定义的内部类,实现绑定后要执行的操作,例如:后台下载等 private MyBinder myBinder = new MyBinder(); //重写方法,用于与activity之间的通信,默认返回null @Override public IBinder onBind(Intent intent) { return myBinder; } @Override public void onDestroy() { super.onDestroy(); Log.d("MyService", "摧毁"); } @Override public void onCreate() { super.onCreate(); Log.d("MyService", "创建"); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.d("MyService","启动了"); return super.onStartCommand(intent, flags, startId); } //实现内部类,后台要执行的具体的方法 public class MyBinder extends Binder{ public void download(){ Log.d("MyService","执行操作"); //具体的后台下载操作 } } }
现在可以按照开始位置处配置Androidmanifest.xml 了,完成之后,
接下来实现activity中的方法:
public class MainActivity extends AppCompatActivity { private Button button1,button2,button3,button4; //首先创建了一个ServiceConnection的匿名类,在里面重写了onServiceConnected()方法和onServiceDisconnected()方法,这两个方法分别会在Activity与Service建立关联和解除关联的时候调用。 private ServiceConnection connection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { //通过向下转型得到了MyBinder的实例,及MyService中内部类的实例 MyService.MyBinder myBinder = (MyService.MyBinder) service; myBinder.download(); } @Override public void onServiceDisconnected(ComponentName name) { Log.d("MyService","解除绑定"); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init();//获取组件 listeners();//监听组件 } private void init(){ button1 = (Button)findViewById(R.id.start); button2 = (Button)findViewById(R.id.stop); button3 = (Button)findViewById(R.id.bind); button4 = (Button)findViewById(R.id.unbind); } private void listeners(){ button1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //通过startService()开启服务 startService(new Intent(getBaseContext(), MyService.class)); } }); button2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //通过stopService()停止服务 stopService(new Intent(getBaseContext(), MyService.class)); } }); button3.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //通过bindService()绑定服务 bindService(new Intent(getBaseContext(), MyService.class),connection,BIND_AUTO_CREATE); } }); button4.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //通过bindService()解除服务 unbindService(connection); } }); } }
xml布局文件中就四个按钮:
<Button android:id="@+id/start" android:text="开启service" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <Button android:id="@+id/stop" android:text="关闭service" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <Button android:id="@+id/bind" android:text="绑定activity" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <Button android:id="@+id/unbind" android:text="解除绑定activity" android:layout_width="wrap_content" android:layout_height="wrap_content" />
相关文章推荐
- 集成融云Android SDK实现在群聊/讨论组中@人的功能(一)
- Android_实用技术(3)—— Service简析(Ⅲ)
- Android应用内存泄漏笔记
- Android NDK 编译、使用动态库
- 加快Android编译速度的技巧总结
- Android Audio 分析
- android开发步步为营之74:生成facebook注册应用主页需要的Key Hashes
- Android 开发 voip/sip 程序
- Android Fragment 解析
- Android下拉刷新完全解析,教你如何一分钟实现下拉刷新功能(附源码)
- 关于android使用已有id,自己的id和系统id
- 根据现有Bitmap生成相同图案指定大小的新Bitmap
- Android学习杂记
- android之JNI(C和Java互调)
- 浅谈编译高通android5.1源代码
- Android中intent启动Activity中intent.setFlags()的作用
- android listview优化几种写法详细介绍
- Android ListView用EditText实现搜索功能
- 根据屏幕上一条线求出线两侧形成的路的Path
- Umeng 推送