安卓学习笔记之service(一)
2017-06-18 21:52
316 查看
安卓四大组件之Service
今天来入门一下service这个组件,这玩意是在你后台做一些必要的工作。**
1.什么是service?
**从google官网看的,官方的描述是这样的。
A Service is an application component representing either an application’s desire to perform a longer-running operation while not interacting with the user or to supply functionality for other applications to use. Each service class must have a corresponding declaration in its package’s AndroidManifest.xml. Services can be started with Context.startService() and Context.bindService().
懂英语的话就一目了然了,英语水平差点的话就可以有道了。
翻译过来就是说:
服务是应用程序组件,它表示应用程序希望执行长时间运行的操作,而不与用户交互,或为其他应用程序提供功能。每个服务类在其包的androidmanifest.xml中都必须有相应的“声明”。可以使用Context.startService()和context.bindservice()启动服务。
Service是一种在后台长期运行的。没有界面的组件,由其它组件调用进行。
服务不太会被kill,即使在内存不足的时候被kill,当内存恢复足够的时候,服务又会自己的复活。比如:下载的时候就可以放入服务中来做,启动服务,完成时,关闭服务。
2.如何创建与使用service
我们要在manifest文件里进行声明,当然我们使用as的时候我们也可以通过菜单进行快速的创建service省去手动在manifest文件添加的麻烦。会有两种方法。第一种
第一步:创建一个service类,并且分别重写它的父类方法,并在manifest文件里面生命注册<service android:name=".MyService"/>
public class MyService extends Service { @Override public void onCreate() { Log.v("dd","onCreate"); super.onCreate(); } @Nullable @Override public IBinder onBind(Intent intent) { return null; } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.v("dd","onStartCommand"); return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy() { Log.v("dd","onDestroy"); super.onDestroy(); } }
仅仅是添加了log日志打印输出。看看生命周期的顺序。然后在activity_main中添加两个连个按钮控件
<Button android:id="@+id/btn_start" android:text="Start Service" android:textAllCaps="false" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <Button android:id="@+id/btn_stop" android:text="Stop Service" android:textAllCaps="false" android:layout_width="wrap_content" android:layout_height="wrap_content" />
然后在activity类里面测试:
public class MyActivity extends Activity implements View.OnClickListener { private Button btn_start; private Button btn_stop; private Intent intent; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); initView(); intent = new Intent(this,MyService.class); } private void initView() { btn_start= (Button) findViewById(R.id.btn_start); btn_stop= (Button) findViewById(R.id.btn_stop); btn_start.setOnClickListener(this); btn_stop.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()){ case R.id.btn_start: startService(intent); break; case R.id.btn_stop: stopService(intent); break; } } }
当点击start按钮的时候,会看到控制台输入以下的文字:
06-21 06:51:15.995 3006-3006/com.does.service V/dd: onCreate
06-21 06:51:16.001 3006-3006/com.does.service V/dd: onStartCommand
当点击stop按钮的时候会调用:
06-21 06:51:22.829 3006-3006/com.does.service V/dd: onDestroy
第二种
使用bindService的方法布局文件
<Button android:id="@+id/btn_start" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="StartService" android:textAllCaps="false" /> <Button android:id="@+id/btn_stop" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="StopService" android:textAllCaps="false" /> <Button android:id="@+id/btn_bind" android:layout_width= c158 "wrap_content" android:layout_height="wrap_content" android:text="BindService" android:textAllCaps="false" /> <Button android:id="@+id/btn_unbind" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="UnBindService" android:textAllCaps="false" />
MainActivity .java文件
public class MainActivity extends Activity implements View.OnClickListener { private Button btn_bind,btn_unbind; private ServiceConnection connection; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); initEvent(); } private void initEvent() { connection=new ServiceConnection() { @Override public void onServiceConnected(ComponentName componentName, IBinder iBinder) { //服务连接成功的时候操作 } @Override public void onServiceDisconnected(ComponentName componentName) { //服务取消连接的时候 } }; } private void initView() { btn_bind= (Button) findViewById(R.id.btn_bind); btn_unbind= (Button) findViewById(R.id.btn_unbind); btn_bind.setOnClickListener(this); btn_unbind.setOnClickListener(this); } @Override public void onClick(View view) { switch (view.getId()){ case R.id.btn_start: Intent start=new Intent(this,MyService.class); startService(start); break; case R.id.btn_stop: Intent stop=new Intent(this,MyService.class); stopService(stop); break; case R.id.btn_bind: Log.v("does","bind is clicked"); Intent bind=new Intent(this,MyService.class); bindService(bind,connection,BIND_AUTO_CREATE); break; case R.id.btn_unbind: Log.v("does","unbind is clicked"); Intent unbind=new Intent(this,MyService.class); unbindService(connection); break; default: break; } } }
MyService.java
public class MyService extends Service { @Override public void onCreate() { Log.v("does","onCreate"); super.onCreate(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.v("does","onStartCommand"); return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy() { Log.v("does","onDestroy"); super.onDestroy(); } @Nullable @Override public IBinder onBind(Intent intent) { return null; } }
当我们点击bind按钮的时候,发现
07-10 20:01:39.836 24361-24361/com.example.does.myapplication V/does: bind is clicked
07-10 20:01:39.836 24361-24361/com.example.does.myapplication V/does: onCreate
当我们点击unbind的时候,发现
07-10 20:04:09.774 24361-24361/com.example.does.myapplication V/does: unbind is clicked
07-10 20:04:09.774 24361-24361/com.example.does.myapplication V/does: onDestroy
3.service的生命周期
在上面我们看到了和activity类似差不多的方法。组件都会有生命周期。所以我们介绍一下service的生命周期。想必,这样就很形象了吧?
第一种,
onCreate()->onStartCommand()->onDestroy()
第二种就是绑定service
onCreate()->onBind()->unBind()->onDestroy()
两种启动service和停止service的区别就是,第一种启动服务时候,当应用程序退出的时候,后台的service依旧运行,只有运行stopService的时候才停止运行service。那么bindService,整个service进程是随着整个应用程序的生命周期存活,当app的使用内存被系统回收了,那么这个service就会跟着被回收。
相关文章推荐
- 安卓学习笔记1——service开机自启动
- 安卓学习笔记之service和activity
- 安卓学习笔记之IntentService
- 安卓学习笔记---IntentService的分析与使用
- [Silverlight学习笔记]关于利用WCF RIA Service进行通信并在客户端获取数据
- Android开发学习笔记(2):Service的简介和启动方式
- Android开发学习笔记-9 Service基础
- Sharepoint学习笔记--Farm Backup Error:Administration 2010 Service is not started
- 学习笔记16 window service 服务的相关内容
- Android开发学习笔记:Service的远程调用
- WCF 学习笔记 (1) - Specify Fault Behaviors for the Service
- boost asio io_service学习笔记
- flex学习笔记6-----数据通信HTTPService
- 【应用篇】WCF学习笔记(一):Host、Client、MetadataExchage 【应用篇】WCF学习笔记(二):ServiceContract、DataContract
- Boost asio学习笔记之一—— 使用strand支持多线程调用service_io的方法
- 学习笔记:使用Web Service Software Factory开发简易留言本服务以及Mobile调用实现-1.创建Service
- web service入门学习笔记
- Programing WCF Service(WCF编程 第2版 Juval Lowy著 张逸 译)学习笔记(1)
- [Webservice] web service入门学习笔记
- 步步为营 SharePoint 开发学习笔记系列 九、SharePoint web service 开发(上)