AndroidService 深度解析(1)

本文深入探讨了Android Service的生命周期,包括不同操作序列下的Service行为。通过一系列测试,作者展示了STARTSERVICE、BINDSERVICE、UNBINDSERVICE和STOPSERVICE按钮点击的顺序如何影响Service的生命周期方法调用。此外,文章提到了ServiceLife类和MainActivity类的日志输出,以帮助理解Service的创建、启动、绑定和销毁过程。最后,作者指出Service生命周期的复杂性,强调理解onCreate、onDestroy、onStartCommand、onBind和onUnbind等关键方法的重要性。
摘要由CSDN通过智能技术生成

AndroidService 深度解析(1)

      这段时间我重新对Android基础进行了学习,还是先从官方文档开始,做了关于Service的文档翻译,熟悉了关于Service的知识点。但是在用的时候还是有很多需要注意的地方,需要把这些知识点联系起来,因此有了这篇文章。我将主要从以下几个方面对Service类进行深度解析:

1、 Service的生命周期(看起来简单,实际上很复杂的);

2、 绑定运行Service(Bound Service)的多种形式实现及其使用;

      主要包括本地Service继承Binder类的实现、远程Service使用Messenger实现、远程Service的AIDL方式实现。(本来打算这篇一起写,篇幅太长,作为两篇吧)

      如果您有兴趣继续阅读下去,但是您对Service的基础还不怎么熟悉的话,建议您先阅读以下三篇我对官方文档的翻译:

Service API文档 翻译:

http://blog.csdn.net/chtsx/article/details/44276105

Services 综合介绍 :

http://blog.csdn.net/chtsx/article/details/44276189

Bound Service 以绑定方式运行的Service :

http://blog.csdn.net/chtsx/article/details/44276241


Service的生命周期


       虽然Service在它的生命周期中涉及到的方法一共只有onCreate、onStartCommand、onBind、onUnbind、onDestory这几个,但是由于Service拥有两种运行方式,而且可以实现同时为多个客户端服务,支持跨进程,使得它的运行时状态真的很难让人清楚地掌握。而官方给的这个图也很难将Service的生命周期详细地表述。


       为了好好把握Service在不同状态下的运行,我做了多种可能情况下的测试:

       在Android Studio下建立项目AndroidServiceFULLStudy,并新建一个名称为ServiceTest的工程。在ServiceTest工程下,建立一个ServiceLife类、一个MainActivity类,MainActivity与ServiceLife类中将我们执行的操作,与系统调用的生命周期方法都以日志的形式打印出来便于分析。


ServiceLife类:

public class ServiceLife extends Service {
    private String TAG = getClass().getSimpleName();
    MyBinder myBinder=new MyBinder();
    public ServiceLife() {
    }

    public class MyBinder extends Binder {
        public ServiceLife getService() {
            return ServiceLife.this;
        }
    }

    @Override
    public void onCreate() {
        Log.d(TAG, "ServiceLife------>onCreate()");
        super.onCreate();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d(TAG, "ServiceLife------>onStartCommand()");
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public IBinder onBind(Intent intent) {
        Log.d(TAG, "ServiceLife------>onBind()");
        return myBinder;
    }

    @Override
    public void onRebind(Intent intent) {
        Log.d(TAG, "ServiceLife------>onRebind()");
        super.onRebind(intent);
    }

    @Override
    public boolean onUnbind(Intent intent) {
        Log.d(TAG, "ServiceLife------>onUnbind()");
        //return false;
        return true;
    }

    @Override
    public void onDestroy() {
        Log.d(TAG, "ServiceLife------>onDestroy()");
        super.onDestroy();
    }
}


MainActivity类:       

<pre name="code" class="java">public class MainActivity extendsActionBarActivity {
   private String TAG = getClass().getSimpleName();
   Intent serviceIntent;
   @Override
   protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.activity_main);
     Log.d(TAG,"MainActivity------>onCreate()");
     serviceIntent = newIntent(this,ServiceLife.class);}
    publicvoid startService(View v) {
     Log.d(TAG,"MainActivity------>startService()");
     startService(serviceIntent);
    }
   public void stopService(View v) {
     Log.d(TAG,"MainActivity------>stopService()");
     stopService(serviceIntent);
    }
   public void bindService(View v) {
     Log.d(TAG,"MainActivity------>bindService()");
     bindService(serviceIntent, serviceConnection,Service.BIND_AUTO_CREATE);
    }
   public void unBindService(View v) {
     Log.d(TAG, "MainActivity------>unBindService()");
     unbindService(serviceConnection);
    }
   @Override
   protected void onDestroy() {
     Log.d(TAG,"MainActivity------>onDestroy()");
     super.onDestroy();
    }
   ServiceConnection serviceConnection = new ServiceConnection() {
     @Override
     public void onServiceConnected(ComponentNamename, IBinder service) {
      Log.d(TAG,"MainActivity------>onServiceConnected()");
      ServiceLife.MyBinderbinder = (ServiceLife.MyBinder) service;
      ServiceLifeserviceLife = binder.getService();
     }
     @Override
     public voidonServiceDisconnected(ComponentName name) {
      Log.d(TAG,"MainActivity------>onServiceDisconnected()");
     }
    };
}


 MainActivity的界面布局这里就不再附上代码,贴上截图:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值