zoukankan      html  css  js  c++  java
  • 浅谈Android四大组建之一Service---Service与Activity的绑定

    从上一篇文章我们学会了如何创建Service,我们通过监听一个按钮,然后再按钮里面通过意图来启动Service。但是我们有没有发现,启动服务以后,Activity和Service之间的联系好像就断开了。两个组建么有太多的关联。那么,这一篇文章我们来介绍,服务和活动之间的绑定。BYW,服务可以和任何一个活动绑定,而且绑定后都可以获取到相同的Binder实例。

    关于服务的一点小知识:

    一个服务,如果我们调用了startService(),然后再去调用stopService(),那么onDestroy()就会执行,

    如果我们调用了bindService()方法后,又去调用unbindService(),那么onDestroy()就也执行,

    但是,如果你同时调用了startService()和bindService(),然后只是调用了stopService()或只是调用了unbindService(),那么onDestory()是不会执行的。也就是说,如果你同时调用了startService()和bindService(),那么你就必须同时调用stopService()和unbindService(),onDestory()才会执行。

    下面我们还是一样,先看代码吧.

    首先是布局文件,布局文件没什么,就是放置四个按钮而已

     1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     2     xmlns:tools="http://schemas.android.com/tools"
     3     android:layout_width="match_parent"
     4     android:layout_height="match_parent"
     5     android:orientation="vertical"
     6     android:paddingBottom="@dimen/activity_vertical_margin"
     7     android:paddingLeft="@dimen/activity_horizontal_margin"
     8     android:paddingRight="@dimen/activity_horizontal_margin"
     9     android:paddingTop="@dimen/activity_vertical_margin"
    10     tools:context="com.example.servicedemo.MainActivity" >
    11     
    12     <Button 
    13         android:onClick="onclick"
    14         android:id="@+id/bt_start"
    15         android:layout_width="match_parent"
    16         android:layout_height="wrap_content"
    17         android:text="开启服务"
    18         />
    19     
    20      <Button 
    21          android:onClick="onclick"
    22         android:id="@+id/bt_stop"
    23         android:layout_width="match_parent"
    24         android:layout_height="wrap_content"
    25         android:text="关闭服务"
    26         />
    27      
    28        <Button 
    29         android:onClick="onclick"
    30         android:id="@+id/bt_bind"
    31         android:layout_width="match_parent"
    32         android:layout_height="wrap_content"
    33         android:text="绑定服务"
    34         />
    35     
    36      <Button 
    37          android:onClick="onclick"
    38         android:id="@+id/bt_unbind"
    39         android:layout_width="match_parent"
    40         android:layout_height="wrap_content"
    41         android:text="解绑服务"
    42         />
    43 
    44 
    45 </LinearLayout>
    activity_main.xml

     然后是Service文件

     1  package com.example.servicedemo;
     2 
     3 import android.app.Service;
     4 import android.content.Intent;
     5 import android.os.Binder;
     6 import android.os.IBinder;
     7 import android.widget.Toast;
     8 
     9 /**
    10  *************************************************************** 
    11  * 
    12  * @版权 LinFeng
    13  * 
    14  * @作者 LinFeng
    15  * 
    16  * @版本 1.0
    17  * 
    18  * @创建日期 2016-6-8
    19  * 
    20  * @功能描述 
    21  ***************************************************************** 
    22  */
    23 public class MyService extends Service{
    24     
    25 
    26     private MusuicBinder mBinder = new MusuicBinder();
    27     /**
    28      * Service中唯一的抽象方法,必须在子类中实现,这里返回一个MusicBinder的实例是为了能和活动绑定
    29      */
    30     @Override
    31     public IBinder onBind(Intent intent) {
    32         return mBinder;
    33     }
    34     
    35     /**
    36      * 服务创建的时候调用
    37      */
    38     @Override
    39     public void onCreate() {
    40         super.onCreate();
    41     }
    42     
    43     /**
    44      * 每一次服务启动的时候调用,这个案例中,每点击一次start service都会执行的方法
    45      * oncreate只是第一次点击的时候执行
    46      */
    47     @Override
    48     public int onStartCommand(Intent intent, int flags, int startId) {
    49         return super.onStartCommand(intent, flags, startId);
    50     }
    51     
    52     /**
    53      * 服务销毁的时候调用
    54      */
    55     @Override
    56     public void onDestroy() {
    57         super.onDestroy();
    58     }
    59     
    60     /**
    61      * 这里我们虚拟出一个后台播放音乐的服务
    62      */
    63     class MusuicBinder extends Binder{
    64         
    65         /**
    66          * 虚拟方法,假装我在播放音乐。。。。
    67          */
    68         public void playMusic(){
    69             Toast.makeText(MyService.this, "音乐在后台播放", Toast.LENGTH_SHORT).show();
    70         }
    71         
    72         /**
    73          * 虚拟方法,假装我能拿到播放的进度。。。
    74          */
    75         public void getProgress(){
    76             Toast.makeText(MyService.this, "播放到80%", Toast.LENGTH_SHORT).show();
    77         }
    78     }
    79     
    80 }
    MyService

    然后就是主界面的文件

      1 package com.example.servicedemo;
      2 
      3 import android.app.Activity;
      4 import android.content.ComponentName;
      5 import android.content.Intent;
      6 import android.content.ServiceConnection;
      7 import android.os.Bundle;
      8 import android.os.IBinder;
      9 import android.view.View;
     10 import android.widget.Toast;
     11 
     12 public class MainActivity extends Activity {
     13 
     14     private MyService.MusuicBinder mBinder;
     15     
     16     boolean bindService ;//用于判断是否有绑定服务
     17 
     18     private ServiceConnection connection = new ServiceConnection() {
     19 
     20         /**
     21          * 解除绑定服务的时候回掉
     22          */
     23         @Override
     24         public void onServiceDisconnected(ComponentName name) {
     25 
     26         }
     27 
     28         /**
     29          * 服务被绑定的时候回掉
     30          */
     31         @Override
     32         public void onServiceConnected(ComponentName name, IBinder service) {
     33 
     34             mBinder = (MyService.MusuicBinder) service;
     35 
     36             /**
     37              * 调用服务里面的方法
     38              * 成功绑定服务的时候,就会执行这个方法
     39              */
     40             mBinder.playMusic();
     41             // mBinder.getProgress();
     42         }
     43     };
     44     @Override
     45     protected void onCreate(Bundle savedInstanceState) {
     46         super.onCreate(savedInstanceState);
     47         setContentView(R.layout.activity_main);
     48         
     49     }
     50 
     51     public void onclick(View v) {
     52         
     53         switch (v.getId()) {
     54             case R.id.bt_start :
     55 
     56                 /**
     57                  * 服务和活动一样,都是用Intent来启动的, 其实可以把服务理解为没有界面的活动
     58                  */
     59                 Intent startintent = new Intent(this, MyService.class);
     60                 startService(startintent);
     61 
     62                 break;
     63             case R.id.bt_stop :
     64 
     65                 Intent stopintent = new Intent(this, MyService.class);
     66                 stopService(stopintent);
     67 
     68                 break;
     69             case R.id.bt_bind :
     70 
     71                 Intent bindIntent = new Intent(this, MyService.class);
     72                 bindService = bindService(bindIntent, connection,
     73                         BIND_AUTO_CREATE);
     74                 if (bindService) {
     75                     Toast.makeText(this, "服务已经绑定", Toast.LENGTH_SHORT).show();
     76                 }
     77                 break;
     78             case R.id.bt_unbind :
     79 
     80                 /**
     81                  * 在调用这个unbindService接触绑定的方法的时候一定要十分注意
     82                  * 做非空判断,没有绑定服务的情况下去调用解除绑定的方法,会导致
     83                  * 程序直接崩溃
     84                  */
     85                 if (bindService) {
     86                     bindService = false;
     87                     unbindService(connection);
     88                     Toast.makeText(this, "绑定已经解除", Toast.LENGTH_SHORT).show();
     89                 } else {
     90                     Toast.makeText(this, "服务没有绑定绑定", Toast.LENGTH_SHORT).show();
     91                 }
     92 
     93                 break;
     94 
     95             default :
     96                 break;
     97         }
     98     }
     99 
    100 }
    MainActivity

    然后就是运行截图了。由于这个例子很简单,讲解就看注释可以了

  • 相关阅读:
    字符串提取数字/汉字/英文字母
    CHARINDEX,PATINDEX,STUFF函数
    raiserror的用法
    数据库备份与还原(通过命令)
    查询某个字段属于哪些表
    设备驱动基础1:设备模型之总线,驱动,设备
    设备模型之kobject,kset及其关系
    模拟电路创新设计
    cdev、udev
    PCB阻抗调节
  • 原文地址:https://www.cnblogs.com/linfenghp/p/5572656.html
Copyright © 2011-2022 走看看