Service--简单学习
来源:互联网 发布:宁波市软件产业园 编辑:程序博客网 时间:2024/06/03 12:41
参考文章:http://www.runoob.com/w3cnote/android-tutorial-service-1.html
Service是Android提供一个允许长时间留驻后台的一个组件,最常见的 用法就是做轮询操作!或者想在后台做一些事情,比如后台下载更新!
Android中使用Service的方式有两种:
1)StartService()启动Service
2)BindService()启动Service
StartService()和BindService()的区别:
通过前者启动的service,调用者和service无必然联系,当调用者销毁时,service不会销毁而是一直运行,只有调用了StopService才会停止;通过后者启动的service,调用者和service是相互关联的,调用者销毁,那么service也会销毁,如果是多个调用者绑定一个service,其中一个调用者想解除绑定只需调用unbindService(),当所有调用者都解除绑定,service便会销毁。
1.StartService
先上代码:
TestService1.javapublic class TestService1 extends Service{ private final String TAG="TestService"; //必须要实现的方法 @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub Log.i(TAG, "onBind方法被调用"); return null; } //service创建时被调用 @Override public void onCreate() { // TODO Auto-generated method stub Log.i(TAG, "onCreate方法被调用"); super.onCreate(); } //service被启动时调用 @Override public int onStartCommand(Intent intent, int flags, int startId) { // TODO Auto-generated method stub Log.i(TAG, "onStartCommand方法被调用"); return super.onStartCommand(intent, flags, startId); } //service被关闭时调用 @Override public void onDestroy() { // TODO Auto-generated method stub Log.i(TAG, "onDestroy方法被调用"); super.onDestroy(); }}
<!-- 配置Service组件,同时配置一个action --> <service android:name=".TestService1"> <intent-filter > <action android:name="com.example.buttondemo.TestService1"/> </intent-filter> </service>
MainActivity.javapublic class MainActivity extends Activity implements OnClickListener{ private Button btn_start,btn_stop; private Intent intent; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btn_start=(Button)findViewById(R.id.btn_start); btn_stop=(Button)findViewById(R.id.btn_stop); btn_start.setOnClickListener(this); btn_stop.setOnClickListener(this); //创建启动Service的Intent,以及Intent属性 intent=new Intent(); intent.setAction("com.example.buttondemo.TestService1"); } @Override public void onClick(View v) { // TODO Auto-generated method stub switch (v.getId()) { case R.id.btn_start: startService(intent); break; case R.id.btn_stop: stopService(intent); break; default: break; } }}
运行截图:
如图:
第一次点击开始服务,onCreate和onStartCommand方法被调用,再点击开始服务,onCreate方法不再被调用,onStartCommand被调用,直到点击停止服务,onDestroy方法被调用。
①首次启动会创建一个Service实例,依次调用onCreate()和onStartCommand()方法,此时Service 进入运行状态,如果再次调用StartService启动Service,将不会再创建新的Service对象, 系统会直接复用前面创建的Service对象,调用它的onStartCommand()方法!②但这样的Service与它的调用者无必然的联系,就是说当调用者结束了自己的生命周期, 但是只要不调用stopService,那么Service还是会继续运行的!③无论启动了多少次Service,只需调用一次StopService即可停掉Service
2.BindService
Step 1:在自定义的Service中继承Binder,实现自己的IBinder对象
Step 2:通过onBind( )方法返回自己的IBinder对象
Step 3:在绑定该Service的类中定义一个ServiceConnection对象,重写两个方法, onServiceConnected和onDisconnected!然后直接读取IBinder传递过来的参数即可!
TestService2.java:
public class TestService2 extends Service { private final String TAG = "TestService2"; private int count; private boolean quit; //定义onBinder方法所返回的对象 private MyBinder binder = new MyBinder(); public class MyBinder extends Binder { public int getCount() { return count; } } //必须实现的方法,绑定改Service时回调该方法 @Override public IBinder onBind(Intent intent) { Log.i(TAG, "onBind方法被调用!"); return binder; } //Service被创建时回调 @Override public void onCreate() { super.onCreate(); Log.i(TAG, "onCreate方法被调用!"); //创建一个线程动态地修改count的值 new Thread() { public void run() { while(!quit) { try { Thread.sleep(1000); }catch(InterruptedException e){e.printStackTrace();} count++; } }; }.start(); } //Service断开连接时回调 @Override public boolean onUnbind(Intent intent) { Log.i(TAG, "onUnbind方法被调用!"); return true; } //Service被关闭前回调 @Override public void onDestroy() { super.onDestroy(); this.quit = true; Log.i(TAG, "onDestroyed方法被调用!"); } @Override public void onRebind(Intent intent) { Log.i(TAG, "onRebind方法被调用!"); super.onRebind(intent); } }
在AndroidManifest.xml中对Service组件进行注册:
<service android:name=".TestService2" android:exported="false"> <intent-filter> <action android:name="com.jay.example.service.TEST_SERVICE2"/> </intent-filter> </service>
MainActivity.java:
public class MainActivity extends Activity { private Button btnbind; private Button btncancel; private Button btnstatus; //保持所启动的Service的IBinder对象,同时定义一个ServiceConnection对象 TestService2.MyBinder binder; private ServiceConnection conn = new ServiceConnection() { //Activity与Service断开连接时回调该方法 @Override public void onServiceDisconnected(ComponentName name) { System.out.println("------Service DisConnected-------"); } //Activity与Service连接成功时回调该方法 @Override public void onServiceConnected(ComponentName name, IBinder service) { System.out.println("------Service Connected-------"); binder = (TestService2.MyBinder) service; } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btnbind = (Button) findViewById(R.id.btnbind); btncancel = (Button) findViewById(R.id.btncancel); btnstatus = (Button) findViewById(R.id.btnstatus); final Intent intent = new Intent(); intent.setAction("com.jay.example.service.TEST_SERVICE2"); btnbind.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //绑定service bindService(intent, conn, Service.BIND_AUTO_CREATE); } }); btncancel.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //解除service绑定 unbindService(conn); } }); btnstatus.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), "Service的count的值为:" + binder.getCount(), Toast.LENGTH_SHORT).show(); } }); } }
运行图如下:
点击锁定service:
再次点击锁定service,没有任何反应。
点击获取service状态
点击解除service:
使用BindService绑定Service,依次调用onCreate(),onBind()方法, 我们可以在onBind()方法中返回自定义的IBinder对象;再接着调用的是 ServiceConnection的onServiceConnected()方法该方法中可以获得 IBinder对象,从而进行相关操作;当Service解除绑定后会自动调用 onUnbind和onDestroyed方法,当然绑定多客户端情况需要解除所有 的绑定才会调用onDestoryed方法进行销毁!
- Service--简单学习
- Service简单学习
- Android的Service学习之一(简单的Service的框架)
- android Service 的简单使用(学习别人)
- 【Android学习日记】(八) Service的简单使用例子
- android Service 的简单使用(学习别人)
- ROS学习--(十四)编写简单的Service和Client
- 【Java学习笔记】如何写一个简单的Web Service
- Service学习——第一篇(创建简单的Service)
- Service学习
- service学习
- 学习service
- service学习
- Service学习
- 学习Service
- Service学习
- 简单 web service 操作!
- Web Service简单例子
- 系统重温安卓
- git使用教程——Mob分享总结
- HTML的各个标签的默认样式有哪些
- TableView Cell
- iOS开发常用的资源和资料
- Service--简单学习
- 多重循环优化
- DataBinding 再也不用写findviewbyId了
- C#中的泛型
- 35 个 jQuery 小技巧
- C#中的委托(Delegate)和事件(Event)
- Leetcode 169
- iOS 关于scrollView内部子控件的自动布局
- 记录重要工具地址