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简介
注意:服务与其他应用程序对象一样,在其托管进程的主线程中运行。这意味着,如果你的服务要执行任何CPU密集型(例如 MP3 播放)或阻塞(例如网络)操作,它应该在Service中再创建一个子线程,然后在这里去处理耗时操作就没问题了。
2.2 如何创建一个Service
2.3 Service构成
<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>
<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,所以隐式启动咱就不介绍了。
-
样例:
-
创建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>
-
创建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>
-
配套的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>
-
添加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>
-
运行结果
<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 ()函数将被调用。
-
样例
-
创建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>
-
创建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>
-
配套的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>
-
添加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>
-
运行结果
<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可以创建多次,销毁多次,重复使用。