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,创建服务的方式,不同创建方式服务的生命周期)] 的相关文章

  • 输入连接-如何删除选定的文本?

    我为 Android 制作了一个自定义键盘 当我按下键盘的退格按钮时 我使用 getCurrentInputConnection deleteSurroundingText 1 0 从输入字段中删除一个字母 但是 当我选择一些文本然后按退格
  • 如何制作无限的jscrollpane?

    我之前已经实现过拖动滚动 但是创建无限滚动窗格的最佳方法是什么 当然不会有任何滚动条 我将实现拖动滚动 我想做的是在无限表面上实现动态加载 EDIT 当然 它实际上不会是无限的 我想问如何伪造它 您可以执行以下操作 AdjustmentCl
  • Android Realm.io:行/对象不再有效

    这是我的删除功能 它确实找到了workday1 object public static void delete Context context Workday workday Realm realm getRealm context re
  • Java元数据读写

    是否可以以通用方式 对于所有图像类型 在 Java 中读取和写入元数据 我找到了一些示例 但它们总是特定的 例如 JPEG 或 PNG 我需要一些足够通用的东西 而不是到处都有 if else 语句 我不想重写源代码 但这是一个很好的例子
  • 如何使用 Guava 连接字符串?

    我写了一些代码来连接字符串 String inputFile for String inputLine list inputFile inputLine trim 但我不能使用 连接 所以我决定使用 Guava 所以我需要使用Joiner
  • Facebook Android 意图

    我对这个意图有疑问 这个意图是发送文本类型的消息 一切正常 电子邮件 短信 推特以及手机上的任何内容 但唯一有问题的是facebook 它会尝试以链接而不是文本的形式发布 Intent s new Intent android conten
  • HTTP PUT 在 Java 中上传文件

    Edit 我想我已经弄清楚如何执行二进制数据部分 仔细检查代码 但我很确定我做对了 现在 当我尝试按照中所述完成上传时遇到新错误Vimeo API 文档 http vimeo com api docs upload streaming Ed
  • 为什么现在()? (客观化)

    为什么我想要异步加载 Objectify 实体 异步加载到底意味着什么 根据客观化有关加载的文档 https code google com p objectify appengine wiki BasicOperations Loadin
  • 带动画的 ScrollTo(0,250) Android ScrollView

    当我滚动到 0 250 时 我想在滚动动作中包含一个动画 我做了这段代码 但它没有根据动画滚动 scrollMe 是滚动小部件 id ObjectAnimator anim ObjectAnimator ofInt scrollMe tra
  • 我们可以使用 for-each 循环来迭代 Iterator 类型的对象吗? [复制]

    这个问题在这里已经有答案了 如果我们执行以下操作 我们会收到错误 class FGH public static Iterator reverse List list Collections reverse list return list
  • 战争库中的罐子爆炸

    我们可以将分解的 jar 文件放入 war web inf 库中吗 它在 JBOSS 4 2 中对我不起作用 我收到以下错误并且无法部署应用程序 Caused by javax management RuntimeOperationsExc
  • 我们可以有虚假中断吗?

    我正在创建一个任务轮询器 每分钟都会查找任务 它看起来像这样 public class Poller private final ExecutorService e Executors newSingleThreadExecutor pub
  • Google Place Api:来自此 Android 客户端应用程序 com.package.name 的请求被阻止

    我在用PlaceAutocompleteFragment当我单击搜索字段 PlaceAutocompleteFragment 对话框消失时 我收到此错误 errors domain global re ason forbidden mess
  • android 媒体播放器 - 如何禁用范围请求? (Nexus 7 上的音频流中断)

    我有一个音频流应用程序 它运行本地代理服务器 本地代理服务器与互联网流媒体源建立 http 连接 在本地获取并缓冲流数据 然后 在应用程序内部 我使用 MediaPlayer 连接到本地代理服务器 使用方法 mediaPlayer setD
  • 如果抛出RuntimeException,是否可以将其作为异常捕获?

    如果我有一个try抛出一个块RuntimException子类 可以是后续的catch块将其捕获为Exception 具体来说 public class MyAppException extends RuntimeException In
  • 方法签名中带或不带synchronized关键字的方法具有相同的字节码

    对于以下 2 个类 获得相同的 Java 字节码 java版本 java 版本 1 8 0 181 Java TM SE 运行时环境 构建 1 8 0 181 b13 Java HotSpot TM 64 位服务器 VM 内部版本 25 1
  • 从包中发布的错误通知无法展开 RemoteViews

    我有个问题 有时我的服务会被这个 logcat 强制关闭 03 26 20 44 44 849 E AndroidRuntime 12080 FATAL EXCEPTION main 03 26 20 44 44 849 E Android
  • 无法通过usb调试安装android应用程序

    我知道这是一个老问题 但我第一次尝试在 Redmi note 4 上安装我的应用程序 每当我尝试安装时 它都会显示一个对话框 安装失败 并显示消息无法建立会话 通过卸载现有版本的 apk 如果存在 然后重新安装 可能可以解决此问题 警告 卸
  • 如何检测用户是否禁用 GPS(Android - Play 服务)

    我使用 gms location LocationListener Google Play 服务 来获取用户的位置 它工作正常 但我想检测用户何时禁用或启用他 她的 GPS 就像这张照片一样 当我打开 关闭位置时 不会调用任何方法 当我切换
  • 我找不到 IntelliJ 快捷方式

    我使用 vim 一段时间 我知道有一个 intellij vim 插件 我很好奇内置的 IntelliJ 文本导航存在什么 如何打开实时模板来创建模板 如何查看以 tr 开头的现有模板列表 如何进行全局搜索并在当前文档中进行搜索 然后转到下

随机推荐