zoukankan      html  css  js  c++  java
  • Android攻城狮四大组件之Service

    组件篇——Service
    当Android系统内存不足的时候,会杀死优先级别较低的Activity,而基本上Service的优先级要高于Activity,所以程序中如果含有 Service,那么该程序是很难被杀掉的,而且即使 Service 被杀掉,它也很容易自己再次启动,除非人为去停掉。
    -------------------
    Service 本身不能做耗时操作(因为它运行在主线程)。耗时操作交给 Handle 或者 AsyncTask 去处理。
    1. 本地服务(Local Service)
    - 应用程序内部
    - startService(启动服务)、stopService(在“启动源”或者 Activity 中停止服务)、stopSelf(在Service停止服务)、stopSelfResult(在Service中停止服务),后面两种都是服务的自我停止。
    - bindService(绑定服务)、unbindService(解绑)
    通过 startService 或者 bindService 都可以启动服务。
    
    2. 远程服务(Remote Service)
    - Android系统内部的应用程序之间(不是手机之间)
    - 定义 IBinder 接口,通过它,把数据暴露出来,然后把数据提供给启动源或者其他程序。
    远程服务只能通过 IBinder 去启动服务。
    --------------
    我们知道一个Activity是有生命周期的,并且必须在配置文档中进行注册。而Service和Activity是类似的,有类似的生命周期,也必须注册。
    继承关系:
    Service 继承 ContextWrapper,Activity 继承 ContextThemeWrapper,二者共同拥有一个“祖宗类”——Context。
    ------------------
    如图所示是 Service 的两种生命周期(分别以startService和bindService启动)。
    Start方式特点:
       - 服务跟启动源没有任何联系
       - 无法得到服务对象
    Bind方式特点:
       - 通过 Ibinder 接口实例,返回一个ServiceConnection对象给启动源
       - 通过 ServiceConnection对象的相关方法可以得到Service对象

    BindService: 支持数据回传。
    什么时候使用Start?当服务不需要和启动源有任何关联的时候。这样有可能造成的结果:程序都退出了,但Service依然存在,为什么呢?因为二者没有关系。
    不过,利用这种特性,也可以做一些特殊的应用,比如:UI不要了,但后台操作仍然继续的例子。但比较麻烦是就是:数据没办法回传了。
    所以,既想让它们(服务和启动源)分离,又想得到回传数据,就需要将 Start 和 Bind 混合使用。

     1 public class MainActivity extends ActionBarActivity {
     2     Intent intent;
     3     Intent intent2;
     4     MyBindService service;
     5     ServiceConnection conn=new ServiceConnection() {
     6         //当启动源跟service的连接意外丢失会调用这个方法
     7         //比如当service崩溃了或者被强行杀死了
     8         @Override
     9         public void onServiceDisconnected(ComponentName name) {
    10             // TODO Auto-generated method stub
    11             
    12         }
    13         //当启动源跟service的连接后会自动调用
    14         @Override
    15         public void onServiceConnected(ComponentName name, IBinder binder) {
    16             // TODO Auto-generated method stub
    17             service=((MyBinder)binder).getservice();
    18         }
    19     };
    20     @Override
    21     protected void onCreate(Bundle savedInstanceState) {
    22         super.onCreate(savedInstanceState);
    23         setContentView(R.layout.fragment_main);
    24 
    25     }
    26 
    27     public void click(View view) {
    28         switch (view.getId()) {
    29         case R.id.start:
    30             intent = new Intent(MainActivity.this, MyStartService.class);
    31             startService(intent);
    32             break;
    33 
    34         case R.id.stop:
    35             stopService(intent);
    36             break;
    37             
    38         case R.id.paly:
    39             service.Play();
    40             break;
    41         case R.id.pervious:
    42             service.Pervious();
    43             break;
    44         case R.id.next:
    45             service.next();
    46             break;
    47         case R.id.paus:
    48             service.Pause();
    49             break;
    50         case R.id.bind:
    51             intent2 = new Intent(MainActivity.this, MyBindService.class);
    52             //startService(intent2);
    53             bindService(intent2, conn, Service.BIND_AUTO_CREATE);
    54             
    55             break;
    56             
    57         case R.id.unbind:
    58         unbindService(conn);
    59             break;
    60 
    61         }
    62     }
    63 //    @Override
    64 //    protected void onDestroy() {
    65 //        // TODO Auto-generated method stub
    66 //        stopService(intent2);
    67 //        unbindService(conn);
    68 //        super.onDestroy();
    69 //    }
    70     
    71 }
     1 public class MyBindService extends Service {
     2     @Override
     3     public void onCreate() {
     4         // TODO Auto-generated method stub
     5         super.onCreate();
     6         Log.i("--->>", "BindService--onCreate()");
     7     }
     8 
     9     @Override
    10     public boolean onUnbind(Intent intent) {
    11         // TODO Auto-generated method stub
    12         Log.i("--->>", "BindService--onUnbind()");
    13         return super.onUnbind(intent);
    14     }
    15 
    16     @Override
    17     public void onDestroy() {
    18         // TODO Auto-generated method stub
    19         super.onDestroy();
    20         Log.i("--->>", "BindService--onDestroy()");
    21     }
    22 
    23     public class MyBinder extends Binder {
    24         public MyBindService getservice() {
    25 
    26             return MyBindService.this;
    27 
    28         }
    29     }
    30 
    31     @Override
    32     public IBinder onBind(Intent intent) {
    33         // TODO Auto-generated method stub
    34         Log.i("--->>", "BindService--onBind()");
    35 
    36         return new MyBinder();
    37     }
    38     
    39     public void  Play() {
    40         Log.i("--->>", "播放");
    41     }
    42     public void  Pause() {
    43         Log.i("--->>", "暂停");
    44     }
    45     public void  Pervious() {
    46         Log.i("--->>", "上一首");
    47     }
    48     public void  next() {
    49         Log.i("--->>", "下一首");
    50     }
    51 }

     



  • 相关阅读:
    centos 8 安装zabbix4.5
    python调用钉钉机器人发送消息
    基于docker-compose部署Prometheus + Grafana监控系统
    在阿里云上单机部署k8s1.18
    python3使用email模块发送邮件
    mongodb mysql es数据迁移
    Dockerfile详解
    docker-compose部署zabbix5.0
    centos8.1部署gitlab+jenkins
    基于docker-compose部署jumpserver
  • 原文地址:https://www.cnblogs.com/my334420/p/6736337.html
Copyright © 2011-2022 走看看