关闭

Android基础之四大组件---Service(一)

220人阅读 评论(0) 收藏 举报
分类:

Android基础之四大组件—Service(一)

之前想着把Android的基础过一遍,于是就想到了通过写博客的方式来巩固自己所掌握的。写的不好的地方请各位看官多多指教,大家一起进步,有一句话说的不是很好吗:“大家好才是真的好”。

1.什么是Service?

看看官方文档怎么解释的

A Service is an application component that runs in the background, not interacting with the user, for an indefinite period of time. Each service class must have a corresponding <service> declaration in its package's AndroidManifest.xml. Services can be started with Context.startService() and Context.bindService(). 
Note that services, like other application objects, run in the main thread of their hosting process. This means that, if your service is going to do any CPU intensive (such as MP3 playback) or blocking (such as networking) operations, it should spawn its own thread in which to do that work. More information on this can be found in Application Fundamentals: Processes and Threads

概括的意思就是:Service并没有实际界面,而是一直在Android系统的后台运行。一般使用Service为应用程序提供一些服务或不需要界面的功能。例如从Internet下载文件、控制Video播放器等。

2.Service生命周期

Service与Activity一样,也有一个从启动到销毁的过程,但Service的更简单。经历三个阶段,

  • 创建服务
  • 开始服务
  • 销毁服务
    一个服务实际上是继承android.app.Service类,调用Service类中三个方法进行交互,方法如下:
  • public void onCreate(); //创建服务
  • public void onStart(Intent intent, int startId); //开始服务
  • public void onDestroy(); //销毁服务
    接下来编写一个服务类MyService来查看服务的生命周期,代码如下:
public class MyService extends Service{

    private static final String TAG = "MyService";

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    //当服务第一次创建时调用该方法
    @Override
    public void onCreate() {
        super.onCreate();
        Log.d(TAG, "onCreate: ");
    }

    //当服务开始启动时调用
    @Override
    public void onStart(Intent intent, int startId) {
        super.onStart(intent, startId);
        Log.d(TAG, "onStart: ");
    }

    //当服务销毁时调用
    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "onDestroy: ");
    }
}

接下来在AndroidManifest.xml文件中的配置该服务,如下所示:

<service android:enabled="true" android:name="MyService">

其中android:enabled属性的值为true,表示该服务处于激活状态。虽然目前该服务处于激活状态,但是系统仍然不会启动该服务,要想启动该服务必须调用startService方法,代码如下:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private Intent mIntent;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button start = (Button) findViewById(R.id.startService);
        Button stop = (Button) findViewById(R.id.stopService);
        start.setOnClickListener(this);
        stop.setOnClickListener(this);
        mIntent = new Intent(this, MyService.class);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.startService:
                startService(mIntent);      //启动服务
                break;
            case R.id.stopService:
                stopService(mIntent);       //停止服务
                break;
        }
    }
}

下面按如下点击顺序测试
Start Service –> Stop Service –> Start Service –> Start Service –> Start Service –> Stop Service
测试完后,DDMS的Logcat视图输出信息如下:
这里写图片描述
可以看出,只有第一次点击Start Service按钮时才会调用onCreate方法,如果没有点击Stop Service按钮多次点击Start Service按钮,系统只会调用onStart方法,而不会调用onCreate方法。
在讨论完服务生命周期后,总结一下创建和开启服务的步骤。分三步:
(1)创建一个继承android.app.Service类的服务类。Service类涉及3个生命周期方法,但3个方法不一定在子类中覆盖,可以根据不同需求来使用哪些方法。Service类中有个onBind()方法,该方法是抽象方法,在子类中必须覆盖。我会在第3节介绍。
(2)清单文件中配置service。
(3)开启服务用startService(),关闭服务用stopService()。

3.绑定Activity和Service

根据上面例子启动服务,如果未调用stopService来停止服务,这个服务将随着Android系统的启动而启动,关闭而关闭。也就是服务会在Android系统启动后一直在后台运行,直到Android系统关闭后服务才停止。但有时我们希望在启动服务的Activity关闭后服务自动关闭。这就需要Activity和Service绑定。
通过bindService方法可以将Activity和Service绑定。该方法定义如下:

public boolean bindService(Intent service, ServiceConnection conn, int flags)

参数含义如下:

  • 第一个参数:与服务类相关联的Intent对象。
  • 第二个参数:ServiceConnection类型变量,负责连接Intent对象指定的服务。通过ServiceConnection对象可以获得连接成功或失败的状态,并可以获得连接后的服务对象。
  • 第三个参数:一个标志位,一般设置为Context.BIND_AUTO_CREATE;

    重新编写MyService类,在类中添加几个与绑定事件相关的事件方法。代码如下:

public class MyService extends Service {

    private static final String TAG = "MyService";

    private MyBinder myBinder = new MyBinder();

    //成功绑定后调用该方法
    @Override
    public IBinder onBind(Intent intent) {
        Log.d(TAG, "onBind: ");
        return myBinder;
    }

    //重新绑定时调用该方法
    @Override
    public void onRebind(Intent intent) {
        super.onRebind(intent);
        Log.d(TAG, "onRebind: ");
    }

    //解除绑定时调用该方法
    @Override
    public boolean onUnbind(Intent intent) {
        Log.d(TAG, "onUnbind: ");
        return super.onUnbind(intent);
    }

    //当服务第一次创建时调用该方法
    @Override
    public void onCreate() {
        super.onCreate();
        Log.d(TAG, "onCreate: ");
    }

    //当服务开始启动时调用
    @Override
    public void onStart(Intent intent, int startId) {
        super.onStart(intent, startId);
        Log.d(TAG, "onStart: ");
    }

    //当服务销毁时调用
    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "onDestroy: ");
    }

    public class MyBinder extends Binder {
        MyService getService() {
            return MyService.this;
        }
    }
}

然后定义一个MyService变量和一个ServiceConnection变量,代码如下:

    private MyService mService;
    private ServiceConnection mServiceConnection = new ServiceConnection() {
        //成功连接服务后,被调用。在该方法里获得MyService对象
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            //获取MyService对象
            mService =((MyService.MyBinder) service).getService();
            Toast.makeText(MainActivity.this, "Service Connected", Toast.LENGTH_SHORT).show();
        }

        //连接服务失败后,调用该方法。
        @Override
        public void onServiceDisconnected(ComponentName name) {
            mService = null;
            Toast.makeText(MainActivity.this, "Service Failed", Toast.LENGTH_SHORT).show();
        }
    };

最后通过bindService方法来绑定Activity和Service,

bindService(mIntent, mServiceConnection, Context.BIND_AUTO_CREATE);

解除绑定使用

unbindService(mServiceConnection);

在MyService类中定义一个MyBinder类,是为了获得MyService对象实例。在ServiceConnection接口的onServiceConnected方法中的第2个参数是一个IBinder类型的变量,将该参数转换成MyService.MyBinder对象,并使用MyBinder类中的getService方法获取MyService对象。获取到MyService对象后,就可以在Activity中随意操作MyService了。至此,Activity与Service成功通信。

运行程序后,点击Bind Service按钮,截图如下。
这里写图片描述

关闭应用程序后,LogCat视图中打印onUnbind和onDestroy信息,表明在关闭Activity后,服务先被解除绑定,最后被销毁。如果先启动一个服务,然后再绑定服务,会怎么样呢?在这种情况下,虽然服务仍然会成功绑定到Activity上,但在Activity关闭后,服务虽然会被解除绑定,但不会被销毁,也就是说,MyService类的onDestroy方法不会被调用。打印信息如下:

这里写图片描述

1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:33307次
    • 积分:677
    • 等级:
    • 排名:千里之外
    • 原创:30篇
    • 转载:2篇
    • 译文:0篇
    • 评论:14条
    最新评论