Android组件 - service

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



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值