前面一个帖子,小编和大家大概了解了一下AsyncTask的多线程编程技术,今天我想聊一聊Android的四大组件(神器)之一的Service。
要想精通Service的相关知识点,还是需要学习很多东西的,当然小编今天写的这篇文章只能算是让新手快速了解何为Service、如何快速上手并且快速掌握Service的使用方法,算是入门级的教程。好了,老规矩了,废话不多说,我们直接上代码来看看Service如何使用。
PS:在这边小编想插一句嘴,如果大家还在用Eclipse和ADT开发项目,强烈介意尝试或转向AS(Android Studio),至于原因,你问度娘,反正小编自从用了AS,像吃了麦炫,手指停不下来。
----------------------------------------------------------------------------------------------------------------------------------------
【定义一个服务】
首先,我们定义一个MyService.java类,当然作为一个服务类,必须要继承Service(android.app.Service),看代码:
public class MyService extends Service{
@Nullable
@Override
public IBinder onBind(Intent intent) { // 这是一个抽象方法,那么子类是必须要重写的
return null;
}
}
Service --> public abstract IBinder onBind(Intent intent) 这是一个抽象方法,必须被子类重写!
ok,服务定义好了,不能就这么空吧,光溜溜的总得放点干货,不然这个服务就是个摆设,那么下面我们就让这个服务发挥它的作用!
我们在服务里面重写Service中的另一些常用的方法,看代码:
public void onCreate() { // 服务创建时调用
super.onCreate();
}
public int onStartCommand(Intent intent, int flags, int startId) { // 服务启动时调用
return super.onStartCommand(intent, flags, startId);
}
public void onDestroy() { // 服务销毁时调用
super.onDestroy();
}
这边不得不重点提一下onStartCommand()这个方法,因为我们服务所需要处理的逻辑代码都写在这个方法中。
和添加Activity一样,我们添加了一个服务,那么在AndroidManifest.xml文件中必须进行注册才能生效,而且我需要告诉你,这是Android四大组件所共有的特点!!!
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.xin02ma.myapplication">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
......
<activity android:name=".MainActivity">
......
</activity>
<service android:name=".MyService" />
</application>
</manifest>
【启动和停止服务】
服务定义好了,下面我们就直接上代码,来看看这个服务如何启动和停止。
(1)先添加两个Button(activity_main.xml)
<Button
android:id="@+id/start_service"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/start_service" />
<Button
android:id="@+id/stop_service"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/stop_service" />
(2)接下来,修改主函数MainActivity的代码:
public class MainActivity extends Activity implements View.OnClickListener{
private Button startService;
private Button stopService;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); // 采用布局
startService = (Button) super.findViewById(R.id.start_service); // 取得Button实例
stopService = (Button) super.findViewById(R.id.stop_service); // 取得Button实例
startService.setOnClickListener(this); // 监控Button,注册按钮事件
stopService.setOnClickListener(this); // 监控Button,注册按钮时间
}
public void onClick(View v) {
switch (v.getId()) {
case R.id.start_service:
Intent startIntent = new Intent(this, MyService.class);
startService(startIntent); // 启动服务
break;
case R.id.stop_service:
Intent stopIntent = new Intent(this, MyService.class);
stopService(stopIntent); // 停止服务
break;
default:
break; }
}
}
上面的代码真的是太简单了,主要作了以下工作:
(1)取得startService和stopService两个按钮实例,并且注册了点击事件;
(2)通过Intent对象,调用Activity的startService()和stopService()方法来启动和停止服务。
Notice:你们有没有发现一个问题?这里的活动的启动和停止完全是由活动本身控制的,如果我们start了服务,但是没有点击stop,那么服务会一直处于运行状态,此时服务如何让自己停止下来?
庆幸的是,我们可以在不点击stopService按钮的前提下,调用stopSelf()这个方法就能让服务停下来!这么说不明白?没关系,下面我们会通过代码告诉你怎么用它。
----------------------------------------------------------------------------------------------------------------------------------------
【小测试】
既然上面的代码已经能够完成服务的启动和停止的逻辑流程了,那么口说无凭,也很难让人信服,那小编就打个Log给你看看,我们一起看看Service是如何运作的,来,上代码!
.....
private static final String TAG = "MyService";
...
public void onCreate() { // 服务创建时调用 super.onCreate();
Log.d(TAG, "onCreate executed");}
public int onStartCommand(Intent intent, int flags, int startId) { // 服务启动时调用
Log.d(TAG, "onStartCommand executed"); return super.onStartCommand(intent, flags, startId);
}
public void onDestroy() { // 服务销毁时调用
super.onDestroy();
Log.d(TAG, "onDestroy executed");}
这个代码也太简单了吧,添加了3行Log,目的就是看:在我们点击两个按钮的时候,整个Service什么时候创建,什么时候启动,什么时候毁灭!
请相信我,虽然代码很简单,逻辑也很low,但是这样的学习和思考的过程在以后你编写代码的时候,了解Service的生命周期是很很很重要的!
我们来看一下执行结果,运行程序,查看Logcat中的打印日志:
(1)第一次点击StartService按钮后,MyService中的onCreate()和onStartCommand()方法都执行了,图中黄色箭头所示!
此时,我们可以在手机 --> 设置 --> 应用 --> 运行中看到这个服务,小编给您截个图体验一下:
(2)然后我们点击stopService按钮后,MyService中的onDestory()方法被执行,图中蓝色箭头所示!
(3)此时可能你会有一个疑问?当我们点击了startService按钮以后,onCreate()和onStartCommand()方法同时被执行,这两个方法有什么区别?
OK!图中的红色箭头给了我们答案:onCreat()方法是在服务第一次创建的时候调用的,而onStartCommand()方法则在每次启动服务的时候都会被调用。
当我们在服务未启动的时候,点击startService按钮,则此时会执行两个方法;
但是服务启动完成之后,再次点击(随便你点几次)startService按钮,你会发现只有onStartCommand()方法被执行。
----------------------------------------------------------------------------------------------------------------------------------------
【后记】
由于时间有限,Service就暂时先分析到这边,下面就要开始讲讲Service与Activity之间的通信过程,关于绑定和解绑的流程,小编会整理一下思路,好好写,要对得起Android爱好者。
请相信我,虽然帖子写的很基础,很简单,但是基础是最重要的,里面总有大家能够感兴趣的地方,谢谢支持!欢迎批评指正啦~~