android基础 [超级详细android Service组件解析(什么是Service,创建服务的方式,不同创建方式服务的生命周期)]

2023-11-15

1 章节目录

2 Service

2.1 Service简介

2.2 如何创建一个Service

2.3 Service构成

2.3 Service启动方式

3 Service的生命周期

3.1 startService启动的生命周期

3.2 bindService启动的生命周期


2 Service

2.1 Service简介

  • Service是Android四大组件之一,它可以在后台执行长时间运行操作而没有用户界面的应用组件。

  • Service的启动方式有两种:startService启动和bindService启动。

注意:服务与其他应用程序对象一样,在其托管进程的主线程中运行。这意味着,如果你的服务要执行任何CPU密集型(例如 MP3 播放)或阻塞(例如网络)操作,它应该在Service中再创建一个子线程,然后在这里去处理耗时操作就没问题了。

2.2 如何创建一个Service

 

 

2.3 Service构成

  • MyService.java

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#770088">package</span> <span style="color:#0000ff">com</span>.<span style="color:#000000">hopu</span>.<span style="color:#000000">demo</span>;
​
<span style="color:#770088">import</span> <span style="color:#000000">android</span>.<span style="color:#000000">app</span>.<span style="color:#000000">Service</span>;
<span style="color:#770088">import</span> <span style="color:#000000">android</span>.<span style="color:#000000">content</span>.<span style="color:#000000">Intent</span>;
<span style="color:#770088">import</span> <span style="color:#000000">android</span>.<span style="color:#000000">os</span>.<span style="color:#000000">IBinder</span>;
​
<span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">MyService</span> <span style="color:#770088">extends</span> <span style="color:#000000">Service</span> {
    <span style="color:#770088">public</span> <span style="color:#000000">MyService</span>() {
    }
​
    <span style="color:#555555">@Override</span>
    <span style="color:#770088">public</span> <span style="color:#000000">IBinder</span> <span style="color:#000000">onBind</span>(<span style="color:#000000">Intent</span> <span style="color:#000000">intent</span>) {
        <span style="color:#aa5500">// TODO: Return the communication channel to the service.</span>
        <span style="color:#770088">throw</span> <span style="color:#770088">new</span> <span style="color:#000000">UnsupportedOperationException</span>(<span style="color:#aa1111">"Not yet implemented"</span>);
    }
}</span></span>
  • AndroidManifest.xml

<span style="background-color:#f8f8f8"><span style="color:#333333">    <span style="color:#117700"><</span><span style="color:#117700">application</span>
        <span style="color:#0000cc">...</span><span style="color:#117700">></span>
        <span style="color:#117700"><</span><span style="color:#117700">service</span>
            <span style="color:#0000cc">android:name</span>=<span style="color:#aa1111">".MyService"</span>
            <span style="color:#0000cc">android:enabled</span>=<span style="color:#aa1111">"true"</span>
            <span style="color:#0000cc">android:exported</span>=<span style="color:#aa1111">"true"</span><span style="color:#117700">></</span><span style="color:#117700">service</span><span style="color:#117700">></span>
​
        <span style="color:#117700"><</span><span style="color:#117700">activity</span>
            <span style="color:#0000cc">android:name</span>=<span style="color:#aa1111">".MainActivity"</span>
            <span style="color:#0000cc">android:exported</span>=<span style="color:#aa1111">"true"</span><span style="color:#117700">></span>
            <span style="color:#117700"><</span><span style="color:#117700">intent-filter</span><span style="color:#117700">></span>
                <span style="color:#117700"><</span><span style="color:#117700">action</span> <span style="color:#0000cc">android:name</span>=<span style="color:#aa1111">"android.intent.action.MAIN"</span> <span style="color:#117700">/></span>
​
                <span style="color:#117700"><</span><span style="color:#117700">category</span> <span style="color:#0000cc">android:name</span>=<span style="color:#aa1111">"android.intent.category.LAUNCHER"</span> <span style="color:#117700">/></span>
            <span style="color:#117700"></</span><span style="color:#117700">intent-filter</span><span style="color:#117700">></span>
        <span style="color:#117700"></</span><span style="color:#117700">activity</span><span style="color:#117700">></span>
    <span style="color:#117700"></</span><span style="color:#117700">application</span><span style="color:#117700">></span>  </span></span>

2.3 Service启动方式

1. startService

  • 启动Service

    显式启动通过类名称来启动,需要在Intent中指明Service所在的类,并调用startService (lntent)启动service,显式启动代码如下:

    <span style="background-color:#f8f8f8"><span style="color:#000000">Intent</span> <span style="color:#000000">intentStart</span> <span style="color:#981a1a">=</span> <span style="color:#770088">new</span> <span style="color:#000000">Intent</span>(<span style="color:#000000">ServiceActivity</span>.<span style="color:#770088">this</span>, <span style="color:#000000">StartService</span>.<span style="color:#770088">class</span>);
    <span style="color:#000000">startService</span>(<span style="color:#000000">intentStart</span>);</span>

在上面的代码中,Intent指明了启动的Service所在类为StartService。

通过该方式启动Service,访问者与Service之间没有关联,即使访问者退出了,Service也仍然运行。

  • 停止service

    显式启动停止Service,需要将启动Service的Intent传递给stopService (Intent)函数,代码如下:

    <span style="background-color:#f8f8f8">stopService(intentStart);</span>

    因Android5.0开始,Google要求必须使用显示Intent启动Service,所以隐式启动咱就不介绍了。

  • 样例:

    1. 创建StartService.java继承自Service类,重写onCreate()方法、onStartCommand()方法、onBind()方法、onDestroy()方法,其代码如下:

      <span style="background-color:#f8f8f8"><span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">StartService</span> <span style="color:#770088">extends</span> <span style="color:#000000">Service</span> {
          <span style="color:#555555">@Override</span>
          <span style="color:#770088">public</span> <span style="color:#008855">void</span> <span style="color:#000000">onCreate</span>() {
              <span style="color:#770088">super</span>.<span style="color:#000000">onCreate</span>();
              <span style="color:#000000">Log</span>.<span style="color:#000000">e</span>(<span style="color:#000000">getClass</span>().<span style="color:#000000">getName</span>(), <span style="color:#aa1111">"onCreate"</span>);
          }
          <span style="color:#555555">@Override</span>
          <span style="color:#770088">public</span> <span style="color:#008855">int</span> <span style="color:#000000">onStartCommand</span>(<span style="color:#000000">Intent</span> <span style="color:#000000">intent</span>, <span style="color:#008855">int</span> <span style="color:#000000">flags</span>, <span style="color:#008855">int</span> <span style="color:#000000">startId</span>) {
              <span style="color:#000000">Log</span>.<span style="color:#000000">e</span>(<span style="color:#000000">getClass</span>().<span style="color:#000000">getName</span>(), <span style="color:#aa1111">"onStartCommand"</span>);
              <span style="color:#770088">return</span> <span style="color:#770088">super</span>.<span style="color:#000000">onStartCommand</span>(<span style="color:#000000">intent</span>, <span style="color:#000000">flags</span>, <span style="color:#000000">startId</span>);
          }
          <span style="color:#555555">@Override</span>
          <span style="color:#770088">public</span> <span style="color:#008855">void</span> <span style="color:#000000">onDestroy</span>() {
              <span style="color:#000000">Log</span>.<span style="color:#000000">e</span>(<span style="color:#000000">getClass</span>().<span style="color:#000000">getName</span>(), <span style="color:#aa1111">"onDestroy"</span>);
              <span style="color:#770088">super</span>.<span style="color:#000000">onDestroy</span>();
          }
      ​
          <span style="color:#555555">@Nullable</span>
          <span style="color:#555555">@Override</span>
          <span style="color:#770088">public</span> <span style="color:#000000">IBinder</span> <span style="color:#000000">onBind</span>(<span style="color:#000000">Intent</span> <span style="color:#000000">intent</span>) {
              <span style="color:#770088">return</span> <span style="color:#221199">null</span>;
          }
      }</span>
    2. 创建ServiceActivity.java,其代码如下:

      <span style="background-color:#f8f8f8"><span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">ServiceActivity</span> <span style="color:#770088">extends</span> <span style="color:#000000">AppCompatActivity</span>  {
          <span style="color:#555555">@Override</span>
          <span style="color:#770088">protected</span> <span style="color:#008855">void</span> <span style="color:#000000">onCreate</span>(<span style="color:#000000">Bundle</span> <span style="color:#000000">savedInstanceState</span>) {
              <span style="color:#770088">super</span>.<span style="color:#000000">onCreate</span>(<span style="color:#000000">savedInstanceState</span>);
              <span style="color:#000000">setContentView</span>(<span style="color:#000000">R</span>.<span style="color:#000000">layout</span>.<span style="color:#000000">activity_service</span>);
              <span style="color:#000000">Intent</span> <span style="color:#000000">intentStart</span> <span style="color:#981a1a">=</span> <span style="color:#770088">new</span> <span style="color:#000000">Intent</span>(<span style="color:#000000">ServiceActivity</span>.<span style="color:#770088">this</span>, <span style="color:#000000">StartService</span>.<span style="color:#770088">class</span>);
              <span style="color:#000000">findViewById</span>(<span style="color:#000000">R</span>.<span style="color:#000000">id</span>.<span style="color:#000000">btn_start</span>).<span style="color:#000000">setOnClickListener</span>(<span style="color:#770088">new</span> <span style="color:#000000">View</span>.<span style="color:#000000">OnClickListener</span>() {
                  <span style="color:#555555">@Override</span>
                  <span style="color:#770088">public</span> <span style="color:#008855">void</span> <span style="color:#000000">onClick</span>(<span style="color:#000000">View</span> <span style="color:#000000">v</span>) {
                      <span style="color:#000000">startService</span>(<span style="color:#000000">intentStart</span>);
                  }
              });
              <span style="color:#000000">findViewById</span>(<span style="color:#000000">R</span>.<span style="color:#000000">id</span>.<span style="color:#000000">btn_stop</span>).<span style="color:#000000">setOnClickListener</span>(<span style="color:#770088">new</span> <span style="color:#000000">View</span>.<span style="color:#000000">OnClickListener</span>() {
                  <span style="color:#555555">@Override</span>
                  <span style="color:#770088">public</span> <span style="color:#008855">void</span> <span style="color:#000000">onClick</span>(<span style="color:#000000">View</span> <span style="color:#000000">v</span>) {
                      <span style="color:#000000">stopService</span>(<span style="color:#000000">intentStart</span>);
                  }
              });
          }
      }</span>
    3. 配套的activity_service.xml文件,其代码如下:

      <span style="background-color:#f8f8f8"><span style="color:#555555"><?xml</span> <span style="color:#555555">version="1.0" encoding="utf-8"?></span>
      <span style="color:#117700"><</span><span style="color:#117700">LinearLayout</span> <span style="color:#0000cc">xmlns:android</span>=<span style="color:#aa1111">"http://schemas.android.com/apk/res/android"</span>
          <span style="color:#0000cc">android:id</span>=<span style="color:#aa1111">"@+id/ll_bg"</span>
          <span style="color:#0000cc">android:layout_width</span>=<span style="color:#aa1111">"match_parent"</span>
          <span style="color:#0000cc">android:layout_height</span>=<span style="color:#aa1111">"match_parent"</span>
          <span style="color:#0000cc">android:orientation</span>=<span style="color:#aa1111">"vertical"</span>
          <span style="color:#0000cc">android:background</span>=<span style="color:#aa1111">"@color/color_666666"</span><span style="color:#117700">></span>
          <span style="color:#117700"><</span><span style="color:#117700">Button</span>
              <span style="color:#0000cc">android:id</span>=<span style="color:#aa1111">"@+id/btn_start"</span>
              <span style="color:#0000cc">android:layout_width</span>=<span style="color:#aa1111">"wrap_content"</span>
              <span style="color:#0000cc">android:layout_height</span>=<span style="color:#aa1111">"wrap_content"</span>
              <span style="color:#0000cc">android:text</span>=<span style="color:#aa1111">"start启动服务"</span><span style="color:#117700">/></span>
          <span style="color:#117700"><</span><span style="color:#117700">Button</span>
              <span style="color:#0000cc">android:id</span>=<span style="color:#aa1111">"@+id/btn_stop"</span>
              <span style="color:#0000cc">android:layout_width</span>=<span style="color:#aa1111">"wrap_content"</span>
              <span style="color:#0000cc">android:layout_height</span>=<span style="color:#aa1111">"wrap_content"</span>
              <span style="color:#0000cc">android:text</span>=<span style="color:#aa1111">"start停止服务"</span><span style="color:#117700">/></span>
      <span style="color:#117700"></</span><span style="color:#117700">LinearLayout</span><span style="color:#117700">></span></span>
    4. 添加Service组件声明,在AndroidManifest.xml文件中声明一个Service组件,其代码如下:

      <span style="background-color:#f8f8f8"><span style="color:#555555"><?xml</span> <span style="color:#555555">version="1.0" encoding="utf-8"?></span>
      <span style="color:#117700"><</span><span style="color:#117700">manifest</span> <span style="color:#0000cc">xmlns:android</span>=<span style="color:#aa1111">"http://schemas.android.com/apk/res/android"</span>
          <span style="color:#0000cc">package</span>=<span style="color:#aa1111">"com.scc.demo"</span><span style="color:#117700">></span>
          <span style="color:#117700"><</span><span style="color:#117700">application</span>
              <span style="color:#0000cc">...</span><span style="color:#117700">></span>
              <span style="color:#117700"><</span><span style="color:#117700">activity</span>
                 <span style="color:#0000cc">...</span><span style="color:#117700">></span>
                  <span style="color:#117700"><</span><span style="color:#117700">intent-filter</span><span style="color:#117700">></span>
                      ...
                  <span style="color:#117700"></</span><span style="color:#117700">intent-filter</span><span style="color:#117700">></span>
              <span style="color:#117700"></</span><span style="color:#117700">activity</span><span style="color:#117700">></span>
              <span style="color:#117700"><</span><span style="color:#117700">service</span> <span style="color:#0000cc">android:name</span>=<span style="color:#aa1111">".service.StartService"</span><span style="color:#117700">/></span>
          <span style="color:#117700"></</span><span style="color:#117700">application</span><span style="color:#117700">></span>
      <span style="color:#117700"></</span><span style="color:#117700">manifest</span><span style="color:#117700">></span></span>
    5. 运行结果

      <span style="background-color:#f8f8f8">06-21 16:41:11.474 E/-SCC-: com.scc.demo.actvitiy.ServiceActivityonCreate
      06-21 16:41:11.481 E/-SCC-: com.scc.demo.actvitiy.ServiceActivityonStart
      06-21 16:41:11.482 E/-SCC-: com.scc.demo.actvitiy.ServiceActivityonResume
      06-21 16:41:13.313 E/-SCC-com.scc.demo.service.StartService: onCreate
      06-21 16:41:13.334 E/-SCC-com.scc.demo.service.StartService: onStartCommand
      06-21 16:41:16.705 E/-SCC-com.scc.demo.service.StartService: onDestroy</span>

2. bindService

  • 使用bindService()方法启动Service

    绑定模式使用bindService()方法启动Service,其格式如下:

    <span style="background-color:#f8f8f8"><span style="color:#000000">bindService</span>(<span style="color:#000000">Intent</span> <span style="color:#000000">service</span>,<span style="color:#000000">ServiceConnection</span> <span style="color:#000000">conn</span>,<span style="color:#008855">int</span> <span style="color:#000000">flags</span>);</span>

    其中的参数说明如下:

    • service:该参数通过Intent指定需要启动的service。

    • conn:该参数是ServiceConnnection对象,当绑定成功后,系统将调用serviceConnnection的onServiceConnected ()方法,当绑定意外断开后,系统将调用ServiceConnnection中的onServiceDisconnected方法。

    • flags:该参数指定绑定时是否自动创建Service。如果指定为BIND_AUTO_CREATE,则自动创建,指定为0,则不自动创建。

    绑定方式中,当调用者通过bindService()函数绑定Service时,onCreate()函数和onBinde ( )函数将被先后调用。

    通过该方式启动Service,访问者与Service绑定在一起,访问者一旦退出了,Service也就终止了。

  • 使用unbindService()方法取消绑定

    取消绑定仅需要使用unbindService()方法,并将ServiceConnnection传递给unbindService()方法。

    但需要注意的是,unbindService()方法成功后,系统并不会调用onServiceConnected(),因为onServiceConnected()仅在意外断开绑定时才被调用。

    当调用者通过unbindService()函数取消绑定Service时,onUnbind()函数将被调用。如果onUnbind()函数返回true,则表示重新绑定服务时,onRebind ()函数将被调用。

  • 样例

    1. 创建BindService.java继承自Service类,重写onCreate()方法、onBind()方法、onUnbind()方法、onDestroy()方法,实现本地通知栏显示,其代码如下:

      <span style="background-color:#f8f8f8"><span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">BindService</span> <span style="color:#770088">extends</span> <span style="color:#000000">Service</span> {
          <span style="color:#aa5500">//声明IBinder接口的一个接口变量mBinder</span>
          <span style="color:#770088">public</span> <span style="color:#770088">final</span> <span style="color:#000000">IBinder</span> <span style="color:#000000">mBinder</span> <span style="color:#981a1a">=</span> <span style="color:#770088">new</span> <span style="color:#000000">LocalBinder</span>();
          <span style="color:#770088">private</span> <span style="color:#000000">NotificationManager</span> <span style="color:#000000">mNM</span>;
          <span style="color:#770088">private</span> <span style="color:#008855">int</span> <span style="color:#000000">NOTIFICATION</span> <span style="color:#981a1a">=</span> <span style="color:#000000">R</span>.<span style="color:#000000">string</span>.<span style="color:#000000">local_service_started</span>;
          <span style="color:#aa5500">//LocalBinder是继承Binder的一个内部类</span>
          <span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">LocalBinder</span> <span style="color:#770088">extends</span> <span style="color:#000000">Binder</span> {
              <span style="color:#770088">public</span> <span style="color:#000000">BindService</span> <span style="color:#000000">getService</span>() {
                  <span style="color:#770088">return</span> <span style="color:#000000">BindService</span>.<span style="color:#770088">this</span>;
              }
          }
          <span style="color:#555555">@Override</span>
          <span style="color:#770088">public</span> <span style="color:#008855">void</span> <span style="color:#000000">onCreate</span>() {
              <span style="color:#000000">mNM</span> <span style="color:#981a1a">=</span> (<span style="color:#000000">NotificationManager</span>)<span style="color:#000000">getSystemService</span>(<span style="color:#000000">NOTIFICATION_SERVICE</span>);
              <span style="color:#000000">Log</span>.<span style="color:#000000">e</span>(<span style="color:#000000">getClass</span>().<span style="color:#000000">getName</span>(), <span style="color:#aa1111">"onCreate"</span>);
              <span style="color:#000000">showNotification</span>();
          }
      ​
          <span style="color:#555555">@Override</span>
          <span style="color:#770088">public</span> <span style="color:#008855">void</span> <span style="color:#000000">onDestroy</span>() {
              <span style="color:#000000">Log</span>.<span style="color:#000000">e</span>(<span style="color:#000000">getClass</span>().<span style="color:#000000">getName</span>(), <span style="color:#aa1111">"onDestroy"</span>);
              <span style="color:#000000">mNM</span>.<span style="color:#000000">cancel</span>(<span style="color:#000000">NOTIFICATION</span>);
              <span style="color:#000000">Toast</span>.<span style="color:#000000">makeText</span>(<span style="color:#770088">this</span>, <span style="color:#000000">R</span>.<span style="color:#000000">string</span>.<span style="color:#000000">local_service_stopped</span>, <span style="color:#000000">Toast</span>.<span style="color:#000000">LENGTH_SHORT</span>).<span style="color:#000000">show</span>();
          }
          <span style="color:#555555">@Override</span>
          <span style="color:#770088">public</span> <span style="color:#000000">IBinder</span> <span style="color:#000000">onBind</span>(<span style="color:#000000">Intent</span> <span style="color:#000000">intent</span>) {
              <span style="color:#000000">Log</span>.<span style="color:#000000">e</span>(<span style="color:#000000">getClass</span>().<span style="color:#000000">getName</span>(), <span style="color:#aa1111">"onBind"</span>);
              <span style="color:#770088">return</span> <span style="color:#000000">mBinder</span>;
          }
          <span style="color:#555555">@Override</span>
          <span style="color:#770088">public</span> <span style="color:#008855">boolean</span> <span style="color:#000000">onUnbind</span>(<span style="color:#000000">Intent</span> <span style="color:#000000">intent</span>) {
              <span style="color:#000000">Log</span>.<span style="color:#000000">e</span>(<span style="color:#000000">getClass</span>().<span style="color:#000000">getName</span>(), <span style="color:#aa1111">"onUnbind"</span>);
              <span style="color:#770088">return</span> <span style="color:#770088">super</span>.<span style="color:#000000">onUnbind</span>(<span style="color:#000000">intent</span>);
          }
          <span style="color:#770088">private</span> <span style="color:#008855">void</span> <span style="color:#000000">showNotification</span>() {
              <span style="color:#008855">String</span> <span style="color:#000000">CHANNEL_ID</span> <span style="color:#981a1a">=</span> <span style="color:#aa1111">"channel_01"</span>;<span style="color:#aa5500">//应用频道Id唯一值, 长度若太长可能会被截断,</span>
              <span style="color:#008855">String</span> <span style="color:#000000">CHANNEL_NAME</span> <span style="color:#981a1a">=</span> <span style="color:#aa1111">"channel_test"</span>;<span style="color:#aa5500">//最长40个字符,太长会被截断</span>
              
              <span style="color:#000000">CharSequence</span> <span style="color:#000000">text</span> <span style="color:#981a1a">=</span> <span style="color:#000000">getText</span>(<span style="color:#000000">R</span>.<span style="color:#000000">string</span>.<span style="color:#000000">local_service_started</span>);
              <span style="color:#000000">PendingIntent</span> <span style="color:#000000">contentIntent</span> <span style="color:#981a1a">=</span> <span style="color:#000000">PendingIntent</span>.<span style="color:#000000">getActivity</span>(<span style="color:#770088">this</span>, <span style="color:#116644">0</span>,
                      <span style="color:#770088">new</span> <span style="color:#000000">Intent</span>(<span style="color:#770088">this</span>, <span style="color:#000000">ServiceActivity</span>.<span style="color:#770088">class</span>), <span style="color:#116644">0</span>);
              <span style="color:#000000">Notification</span> <span style="color:#000000">notification</span> <span style="color:#981a1a">=</span> <span style="color:#770088">new</span> <span style="color:#000000">NotificationCompat</span>.<span style="color:#000000">Builder</span>(<span style="color:#770088">this</span>,<span style="color:#000000">CHANNEL_ID</span>)
                      .<span style="color:#000000">setSmallIcon</span>(<span style="color:#000000">R</span>.<span style="color:#000000">mipmap</span>.<span style="color:#000000">ic_launcher</span>)
                      .<span style="color:#000000">setTicker</span>(<span style="color:#000000">text</span>)
                      .<span style="color:#000000">setWhen</span>(<span style="color:#000000">System</span>.<span style="color:#000000">currentTimeMillis</span>())
                      .<span style="color:#000000">setContentTitle</span>(<span style="color:#000000">getText</span>(<span style="color:#000000">R</span>.<span style="color:#000000">string</span>.<span style="color:#000000">local_service_label</span>))
                      .<span style="color:#000000">setContentText</span>(<span style="color:#000000">text</span>)
                      .<span style="color:#000000">setContentIntent</span>(<span style="color:#000000">contentIntent</span>)
                      .<span style="color:#000000">build</span>();
              <span style="color:#aa5500">//Android 8.0 以上需包添加渠道</span>
              <span style="color:#770088">if</span> (<span style="color:#000000">Build</span>.<span style="color:#000000">VERSION</span>.<span style="color:#000000">SDK_INT</span> <span style="color:#981a1a">>=</span> <span style="color:#000000">Build</span>.<span style="color:#000000">VERSION_CODES</span>.<span style="color:#000000">O</span>) {
                  <span style="color:#000000">NotificationChannel</span> <span style="color:#000000">notificationChannel</span> <span style="color:#981a1a">=</span> <span style="color:#770088">new</span> <span style="color:#000000">NotificationChannel</span>(<span style="color:#000000">CHANNEL_ID</span>,
                          <span style="color:#000000">CHANNEL_NAME</span>, <span style="color:#000000">NotificationManager</span>.<span style="color:#000000">IMPORTANCE_LOW</span>);
                  <span style="color:#000000">mNM</span>.<span style="color:#000000">createNotificationChannel</span>(<span style="color:#000000">notificationChannel</span>);
              }
              <span style="color:#000000">mNM</span>.<span style="color:#000000">notify</span>(<span style="color:#000000">NOTIFICATION</span>, <span style="color:#000000">notification</span>);
              <span style="color:#000000">Log</span>.<span style="color:#000000">e</span>(<span style="color:#000000">getClass</span>().<span style="color:#000000">getName</span>(), <span style="color:#aa1111">"通知栏已出"</span>);
          }
      }</span>
    2. 创建ServiceActivity.java,其代码如下:

      <span style="background-color:#f8f8f8"><span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">ServiceActivity</span> <span style="color:#770088">extends</span> <span style="color:#000000">AppCompatActivity</span> {
          <span style="color:#770088">private</span> <span style="color:#000000">BindService</span> <span style="color:#000000">bindService</span>;
          <span style="color:#770088">private</span> <span style="color:#008855">boolean</span> <span style="color:#000000">isBind</span> <span style="color:#981a1a">=</span> <span style="color:#221199">false</span>;
          <span style="color:#555555">@Override</span>
          <span style="color:#770088">protected</span> <span style="color:#008855">void</span> <span style="color:#000000">onCreate</span>(<span style="color:#000000">Bundle</span> <span style="color:#000000">savedInstanceState</span>) {
              <span style="color:#770088">super</span>.<span style="color:#000000">onCreate</span>(<span style="color:#000000">savedInstanceState</span>);
              <span style="color:#000000">setContentView</span>(<span style="color:#000000">R</span>.<span style="color:#000000">layout</span>.<span style="color:#000000">activity_service</span>);
              <span style="color:#000000">findViewById</span>(<span style="color:#000000">R</span>.<span style="color:#000000">id</span>.<span style="color:#000000">btn_bind</span>).<span style="color:#000000">setOnClickListener</span>(<span style="color:#770088">new</span> <span style="color:#000000">View</span>.<span style="color:#000000">OnClickListener</span>() {
                  <span style="color:#555555">@Override</span>
                  <span style="color:#770088">public</span> <span style="color:#008855">void</span> <span style="color:#000000">onClick</span>(<span style="color:#000000">View</span> <span style="color:#000000">v</span>) {
                      <span style="color:#770088">if</span> (<span style="color:#981a1a">!</span><span style="color:#000000">isBind</span>) {
                          <span style="color:#000000">Intent</span> <span style="color:#000000">intentBind</span> <span style="color:#981a1a">=</span> <span style="color:#770088">new</span> <span style="color:#000000">Intent</span>(<span style="color:#000000">ServiceActivity</span>.<span style="color:#770088">this</span>, <span style="color:#000000">BindService</span>.<span style="color:#770088">class</span>);
                          <span style="color:#000000">bindService</span>(<span style="color:#000000">intentBind</span>, <span style="color:#000000">serviceConnection</span>, <span style="color:#000000">Context</span>.<span style="color:#000000">BIND_AUTO_CREATE</span>);
                          <span style="color:#000000">isBind</span> <span style="color:#981a1a">=</span> <span style="color:#221199">true</span>;
                      }
                  }
              });
              <span style="color:#000000">findViewById</span>(<span style="color:#000000">R</span>.<span style="color:#000000">id</span>.<span style="color:#000000">btn_unbing</span>).<span style="color:#000000">setOnClickListener</span>(<span style="color:#770088">new</span> <span style="color:#000000">View</span>.<span style="color:#000000">OnClickListener</span>() {
                  <span style="color:#555555">@Override</span>
                  <span style="color:#770088">public</span> <span style="color:#008855">void</span> <span style="color:#000000">onClick</span>(<span style="color:#000000">View</span> <span style="color:#000000">v</span>) {
                      <span style="color:#770088">if</span> (<span style="color:#000000">isBind</span>) {
                          <span style="color:#000000">isBind</span> <span style="color:#981a1a">=</span> <span style="color:#221199">false</span>;
                          <span style="color:#000000">unbindService</span>(<span style="color:#000000">serviceConnection</span>);
                          <span style="color:#000000">bindService</span> <span style="color:#981a1a">=</span> <span style="color:#221199">null</span>;
                      }
                  }
              });
          }
      ​
          <span style="color:#770088">private</span> <span style="color:#000000">ServiceConnection</span> <span style="color:#000000">serviceConnection</span> <span style="color:#981a1a">=</span> <span style="color:#770088">new</span> <span style="color:#000000">ServiceConnection</span>() {
              <span style="color:#555555">@Override</span>
              <span style="color:#770088">public</span> <span style="color:#008855">void</span> <span style="color:#000000">onServiceConnected</span>(<span style="color:#000000">ComponentName</span> <span style="color:#000000">name</span>, <span style="color:#000000">IBinder</span> <span style="color:#000000">service</span>) {
                  <span style="color:#000000">Log</span>.<span style="color:#000000">e</span>(<span style="color:#000000">getClass</span>().<span style="color:#000000">getName</span>(), <span style="color:#aa1111">"onServiceConnected"</span>);
                  <span style="color:#000000">bindService</span> <span style="color:#981a1a">=</span> ((<span style="color:#000000">BindService</span>.<span style="color:#000000">LocalBinder</span>) <span style="color:#000000">service</span>).<span style="color:#000000">getService</span>();
              }
      ​
              <span style="color:#555555">@Override</span>
              <span style="color:#770088">public</span> <span style="color:#008855">void</span> <span style="color:#000000">onServiceDisconnected</span>(<span style="color:#000000">ComponentName</span> <span style="color:#000000">name</span>) {
                  <span style="color:#000000">Log</span>.<span style="color:#000000">e</span>(<span style="color:#000000">getClass</span>().<span style="color:#000000">getName</span>(), <span style="color:#aa1111">"onServiceDisconnected"</span>);
                  <span style="color:#000000">bindService</span> <span style="color:#981a1a">=</span> <span style="color:#221199">null</span>;
              }
          };
      }</span>
    3. 配套的activity_service.xml文件,其代码如下:

      <span style="background-color:#f8f8f8"><span style="color:#555555"><?xml</span> <span style="color:#555555">version="1.0" encoding="utf-8"?></span>
      <span style="color:#117700"><</span><span style="color:#117700">LinearLayout</span> <span style="color:#0000cc">xmlns:android</span>=<span style="color:#aa1111">"http://schemas.android.com/apk/res/android"</span>
          <span style="color:#0000cc">android:id</span>=<span style="color:#aa1111">"@+id/ll_bg"</span>
          <span style="color:#0000cc">android:layout_width</span>=<span style="color:#aa1111">"match_parent"</span>
          <span style="color:#0000cc">android:layout_height</span>=<span style="color:#aa1111">"match_parent"</span>
          <span style="color:#0000cc">android:orientation</span>=<span style="color:#aa1111">"vertical"</span>
          <span style="color:#0000cc">android:background</span>=<span style="color:#aa1111">"@color/color_666666"</span><span style="color:#117700">></span>
          <span style="color:#117700"><</span><span style="color:#117700">Button</span>
              <span style="color:#0000cc">android:id</span>=<span style="color:#aa1111">"@+id/btn_bind"</span>
              <span style="color:#0000cc">android:layout_width</span>=<span style="color:#aa1111">"wrap_content"</span>
              <span style="color:#0000cc">android:layout_height</span>=<span style="color:#aa1111">"wrap_content"</span>
              <span style="color:#0000cc">android:text</span>=<span style="color:#aa1111">"bind服务绑定"</span><span style="color:#117700">/></span>
          <span style="color:#117700"><</span><span style="color:#117700">Button</span>
              <span style="color:#0000cc">android:id</span>=<span style="color:#aa1111">"@+id/btn_unbing"</span>
              <span style="color:#0000cc">android:layout_width</span>=<span style="color:#aa1111">"wrap_content"</span>
              <span style="color:#0000cc">android:layout_height</span>=<span style="color:#aa1111">"wrap_content"</span>
              <span style="color:#0000cc">android:text</span>=<span style="color:#aa1111">"bind解除绑定"</span><span style="color:#117700">/></span>
      <span style="color:#117700"></</span><span style="color:#117700">LinearLayout</span><span style="color:#117700">></span></span>
    4. 添加Service组件声明,在AndroidManifest.xml文件中声明一个Service组件,其代码如下:

      <span style="background-color:#f8f8f8"><span style="color:#555555"><?xml</span> <span style="color:#555555">version="1.0" encoding="utf-8"?></span>
      <span style="color:#117700"><</span><span style="color:#117700">manifest</span> <span style="color:#0000cc">xmlns:android</span>=<span style="color:#aa1111">"http://schemas.android.com/apk/res/android"</span>
          <span style="color:#0000cc">package</span>=<span style="color:#aa1111">"com.scc.demo"</span><span style="color:#117700">></span>
          <span style="color:#117700"><</span><span style="color:#117700">application</span>
              <span style="color:#0000cc">...</span><span style="color:#117700">></span>
              <span style="color:#117700"><</span><span style="color:#117700">activity</span>
                 <span style="color:#0000cc">...</span><span style="color:#117700">></span>
                  <span style="color:#117700"><</span><span style="color:#117700">intent-filter</span><span style="color:#117700">></span>
                      ...
                  <span style="color:#117700"></</span><span style="color:#117700">intent-filter</span><span style="color:#117700">></span>
              <span style="color:#117700"></</span><span style="color:#117700">activity</span><span style="color:#117700">></span>
              <span style="color:#117700"><</span><span style="color:#117700">service</span> <span style="color:#0000cc">android:name</span>=<span style="color:#aa1111">".service.BindService"</span><span style="color:#117700">/></span>
          <span style="color:#117700"></</span><span style="color:#117700">application</span><span style="color:#117700">></span>
      <span style="color:#117700"></</span><span style="color:#117700">manifest</span><span style="color:#117700">></span></span>
    5. 运行结果

      <span style="background-color:#f8f8f8">06-21 17:00:04.309 E/-SCC-: com.scc.demo.actvitiy.ServiceActivityonCreate
      06-21 17:00:04.350 E/-SCC-: com.scc.demo.actvitiy.ServiceActivityonStart
      06-21 17:00:04.350 E/-SCC-: com.scc.demo.actvitiy.ServiceActivityonResume
      06-21 17:00:10.088 E/-SCC-com.scc.demo.service.BindService: onCreate
      06-21 17:00:10.120 E/-SCC-com.scc.demo.service.BindService: 通知栏已出
      06-21 17:00:10.145 E/-SCC-com.scc.demo.service.BindService: onBind
      06-21 17:00:10.164 E/-SCC-com.scc.demo.actvitiy.ServiceActivity$5: onServiceConnected
      06-21 17:00:39.111 E/-SCC-com.scc.demo.service.BindService: onUnbind
      06-21 17:00:39.134 E/-SCC-com.scc.demo.service.BindService: onDestroy</span>

3 Service的生命周期

onBind() 是Service必须实现的方法,返回的IBinder对象相当于Service组件的代理对象,Service允许其他程序组件通过IBinder对象来访问Service内部数据,这样即可实现其他程序组件与Service之间的通信。

3.1 startService启动的生命周期

onCreate() 当Service第一次被创建时,由系统调用。

onStartCommand() 当startService方法启动Service时,该方法被调用。

onDestroy() 当Service不再使用时,由系统调用。

注意:一个startService只会创建一次,销毁一次,但可以开始多次,因此,onCreate()和onDestroy()方法只会被调用一次,而onStart()方法会被调用多次。

3.2 bindService启动的生命周期

onCreate() 当Service被创建时,由系统调用。

onBind() 当bindService方法启动Service时,该方法被调用。

onUnbind() 当unbindService方法解除绑定时,该方法被调用。

onDestroy() 当Service不再使用时,由系统调用。

注意:一个bindService可以创建多次,销毁多次,重复使用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

android基础 [超级详细android Service组件解析(什么是Service,创建服务的方式,不同创建方式服务的生命周期)] 的相关文章

随机推荐