Android组件

来源:互联网 发布:企业即时通讯软件 编辑:程序博客网 时间:2024/06/07 17:42

大家应该很清楚,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()查看)。



原创粉丝点击