学习Service
来源:互联网 发布:瑜伽教学软件 编辑:程序博客网 时间:2024/06/05 02:53
Service是Android四大组件之一(其余是Activity、BroadcastReceiver)。作用是在后台工作,比如播放着音乐时候启动小说软件,音乐仍然在播放;在后台检测网络的变化等等;总而言之,在暗地里默默付出的人。
Service在android四大组件中是与Activity最相似的组件,他们都代表可执行的程序。
区别:Service一直在后台运行,没有用户界面。
选择标准:如果某个程序组件需要在运行时向用户呈现某种界面,或者与用户交互,就需要用到Activity,否则使用Service了。
相似:
1、创建的步骤很像,先定义继承子类,在AndroidManifest.xml文件中配置。
2、Service也具有自己的生命周期。
3、都是从Context派生出来的,都可以调用Context.getResources()、getContentResolver()等方法。
Service的两种启动模式:startService()、bindService()
- 通过Context的startService()来启动Service,访问者与Service之间没有关联,即使访问者退出了,Service也仍然运行。
- 通过Context的bindService()来启动Service,访问者与Service绑定在一起,访问者一旦退出,Service也结束。
号称前者为:持续不断,后者称为一退就断!
-------------------------------------------
接下来是startService的启动和停止的代码,该Activity的界面中包含2个按钮,一个按钮用于启动Service,另一个用于停止Service。
Activity的代码:
public class MainActivity extends Activity implements View.OnClickListener, ServiceConnection { private Button btnStartService; private Button btnStoptService;//定义两个按钮 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btnStartService = (Button) findViewById(R.id.btnStartService); btnStoptService = (Button) findViewById(R.id.btnStoptService);//获取两个按钮 btnStartService.setOnClickListener(this); btnStoptService.setOnClickListener(this);//按钮事件 } @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this, MyService.class); //1、创建启动Service的Intent switch (v.getId()) { case R.id.btnStartService: startService(intent); //2、启动指定的Service break; case R.id.btnStoptService: stopService(intent);//3、停止指定的Service break; } }}调用Context里的startService()、stopService()方法即可启动、停止Service,操作十分简单。而且程序使用了显式Intent来启动Service,因为从5.0开始,Google要求必须使用显式Intent启动Service组件。我个人觉得这样十分好,因为像Service这样使用频率高,而且用到的地方都是比较重要部位,这样会提高安全性吧。
接下来是通过startService()启动Service的生命周期:
context.startService() ->onCreate() ->onStartCommand() ->Service running
context.stopService() ->onDestroy() ->Service stop
如果Service已经运行,这是再点击启动按钮,就不会再调用onCreate() 方法,则只会调用onStartCommand()方法,而且可以执行多次.
总结得出 onCreate->onStartCommand(可以多次调用) ->onDestroy
--------------------------------
接下来是bindService()绑定本地Service,并与之通信。
当程序使用startService()来启动Service时,Service和访问者无法进行通信、交换数据。因此如果需要做以上动作,就应该使用bindService()和unbindService方法来启动、关闭Service。
Context的bindService()方法的完整方法签名为:bindService(Intent service,ServiceConnection conn,int flags)
Intent service:该参数通过Intent指定要启动的Service。
ServiceConnection conn:该对象用于监听访问者与Service之间的连接情况(一般情况为this,但要实现ServiceConnection)。
int flags:指定绑定时是否自动创建Service(该参数可以指定0(不自动创建)或BIND_AUTO_CREATE(自动创建))。
当开发Service类时,该Service类必须提供一个IBinder onBind(Intent intent)方法,在绑定本地Service的情况下,onBind(Intent intent)方法所返回的IBinder对象将会传给ServiceConnection对象里onServiceConndected()方法的service参数,这样访问者就可以通过IBinder对象与Service进行通信了。
实际上,开发通常会采用继承Binder(IBinder的实现类)的方式实现自己的IBinder对象。
接下来在Activity中绑定本地Service:
public class MyService extends Service { public MyService() { } @Override public IBinder onBind(Intent intent) { System.out.println("onBind"); return new Binder();//返回一个Binder对象 } @Override //当启动成功后会执行的方法 public int onStartCommand(Intent intent, int flags, int startId) { System.out.println("onStartCommand"); new Thread() { public void run() { super.run(); while (ture) { System.out.println("服务正在运行中..."); try { sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }.start(); return super.onStartCommand(intent, flags, startId); } @Override public void onCreate() { super.onCreate(); System.out.println("onCreate"); } @Override public void onDestroy() { super.onDestroy(); System.out.println("onDestroy"); } @Override public boolean onUnbind(Intent intent) { System.out.println("onUnbind"); return super.onUnbind(intent); }}MainActivity 的代码如下
public class MainActivity extends Activity implements View.OnClickListener, ServiceConnection { private Button btnStartService; private Button btnStoptService; private Button btnBindService; //绑定服务 private Button btnUnBindService;//解除绑定服务 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btnStartService = (Button) findViewById(R.id.btnStartService); btnStoptService = (Button) findViewById(R.id.btnStoptService); btnBindService = (Button) findViewById(R.id.btnBindService);//绑定服务 btnUnBindService = (Button) findViewById(R.id.btnUnBindService);//解除绑定服务 btnStartService.setOnClickListener(this); btnStoptService.setOnClickListener(this); btnBindService.setOnClickListener(this);//按钮事件 btnUnBindService.setOnClickListener(this); } @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this, MyService.class); //指定Intent switch (v.getId()) { case R.id.btnStartService: startService(intent); break; case R.id.btnStoptService: stopService(intent); break; case R.id.btnBindService: bindService(intent, this, Context.BIND_AUTO_CREATE);//绑定服务 break; case R.id.btnUnBindService: unbindService(this);//解除绑定服务 break; } } @Override public void onServiceConnected(ComponentName name, IBinder service) {//服务被绑定成功的时候运行 System.out.println("onServiceConnected"); } @Override public void onServiceDisconnected(ComponentName name) { //进程被杀掉 或者 奔溃的时候运行 System.out.println("onServiceDisconnected"); }使用context.bindService()启动Service的经历:
context.bindService() -> onCreate() ->onBind() ->Service running
unbindService() -> onUnbind() -> onDestroy() ->Service stop
总而言之,onCreate --> onBind(只一次,不可多次绑定) --> onUnbind --> onDestory。
- Service学习
- service学习
- 学习service
- service学习
- Service学习
- 学习Service
- Service学习
- Web service学习笔记
- Web Service学习笔记
- Web Service学习
- Web Service学习[转载]
- web service学习笔记
- Web Service学习
- Web Service 学习进行曲
- Web Service学习
- Web service学习笔记
- Web Service学习
- Web service 学习1
- Linux常用命令集锦
- 考研第5天-线性代数-向量组的线性相关性
- hdu2586 How far away ?&& poj1986 Distance Queries(LCA离线求最短距离)
- leetcode 107 Binary Tree Level Order Traversal II C++
- poj 2387 Til the Cows Come Home
- 学习Service
- java的泛型原理
- 文章标题
- 电脑管家杀毒显示组件破坏解决方法
- 一起talk C栗子吧(第一百五十六回:C语言实例--基于AF_UNIX域的流套接字通信)
- 委托和方法
- Trapping Rain Water
- 旋转字符串
- opencv官方样例学习笔记——introduction_to_svm