大家应该很清楚,Android的四大组件:Activity,Service,ContentProvider和Broadcast。
下面就说说service服务 https://developer.android.google.cn/guide/components/services.html
官方定义是
A Service is an application component representing either an application's desire to perform a longer-running operation whilenot interacting with the user or to supply functionality for other applications to use.
两个关键点:1. 长时间运行;2. 后台,即不与用户交互。
service分为两种,他们的启动方式、生命周期及组件与service是否能够交互等不同。
第一种:
启动方式: 由应用组件(如activity)通过startService启动service。
生命周期:启动后service即可无限期的运行,即使启动它的组件销毁也不会停止。当service的操作完成,通过别的组件调用stopService( )或者服务使用stopSelf( )进行停止。// 可以自行停止吗?
交互:与气动它的组件不能进行交互。
第二种:
启动方式:应用组件通过bindService绑定service。
生命周期:绑定该服务的组件全部(如果有多个)都取消绑定时,此service就会销毁。
交互:允许与启动它的组件交互、发送请求、获取结果,甚至IPC。
使用过程:
几个重要的回调函数:
onStartCommand() //通过startService启动会调用此方法,完成后调用stopService或者stopService停止
onbind() //通过bindService绑定时会调用此方法,通过返回IBinder,供client与service进行通信。
onCreate() //首次创建服务时调用。如果已经在运行则不调用
onDestroy() //服务不再使用且将被销毁时调用,会清理资源所有资源,线程、监听器等。
首先要在manifest中声明:
<manifest ... >
...
<application ... >
<service android:name=".ExampleService" />
...
</application>
</manifest>
创建服务:
通过类Service或者IntentService创建服务类。
先看一个简单的service:
public class MyService extends Service {
private final static String TAG = "MyService";
public MyService() {
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
Log.d(TAG, "onBind");
throw new UnsupportedOperationException("Not yet implemented");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d(TAG, "onStartCommand");
Log.d(TAG, "onCreate processId " + Process.myPid() + ", threadId " + Process.myTid());
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onCreate() {
// Log.d(TAG, "onCreate processId " + Process.myPid() + ", threadId " + Process.myTid());
super.onCreate();
}
@Override
public void onDestroy() {
Log.d(TAG, "onDestroy");
super.onDestroy();
}
}
然后通过activity组件启动:
public class MainActivity extends AppCompatActivity {
private static final String TAG = "SendNoti";
private Button btn;
private GestureOverlayView gestureView;
private WebView mWebview;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = new Intent(this, MyIntentService.class);
this.startService(intent);
}
}
这种是最简单粗暴的启动方式,启动后service会一直存在(可以通过dumpsys activity services查看 ),并运行在应用的主线程(可以通过Process.myTid()查看)。