Android 非绑定 Service
上一章节中我们有提到,启动 Service 有两种方式 startService()
和 bindService()
本章节我们就先来了解下 startService()
启动 Service
startService() 启动 Service
首次启动会创建一个 Service 实例,依次调用 onCreate()
和 onStartCommand()
方法
此时 Service 进入运行状态,如果再次调用 startService()
启动 Service, 将不会再创建新的 Service 对象,系统会直接复用前面创建的 Service 对象,调用它的 onStartCommand()
方法
这样的 Service 与它的调用者无必然的联系,就是说当调用者结束了自己的生命周期,但是只要不调用 stopService()
,那么 Service 还是会继续运行的
无论启动了多少次 Service, 只需调用一次 stopService()
即可停掉 Service
验证 startService()
启动 Service 的调用顺序
-
创建一个 空的 Android 项目
cn.twle.android.StartService
-
在
MainActivity.java
目录下新建一个 ServiceMsTestService.java
package cn.twle.android.startservice; import android.app.Service; import android.content.Intent; import android.os.IBinder; import android.util.Log; public class MsTestService extends Service { private final String TAG = "MsTestService"; //必须要实现的方法 @Override public IBinder onBind(Intent intent) { Log.i(TAG, "onBind方法被调用!"); return null; } //Service被创建时调用 @Override public void onCreate() { Log.i(TAG, "onCreate方法被调用!"); super.onCreate(); } //Service被启动时调用 @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.i(TAG, "onStartCommand方法被调用!"); return super.onStartCommand(intent, flags, startId); } //Service被关闭之前回调 @Override public void onDestroy() { Log.i(TAG, "onDestory方法被调用!"); super.onDestroy(); } }
-
修改
AndroidManifest.xml
完成Service
注册,在</activity>
后添加<!-- 配置 Service 组件,同时配置一个 action --> <service android:name=".MsTestService"> <intent-filter> <action android:name="cn.twle.android.startservice.MS_TEST_SERVICE"/> </intent-filter> </service>
-
修改
activity_main.xml
添加两个按钮<?xml version="1.0" encoding="utf-8" ?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center_horizontal" android:orientation="horizontal" > <Button android:text="启动 Service" android:id="@+id/service_start" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <Button android:text="停止 Service" android:id="@+id/service_stop" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>
-
修改
MainActivity.java
在按钮的点击事件中分别 调用
startService()
和stopService()
package cn.twle.android.startservice; import android.support.v7.app.AppCompatActivity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button service_start = (Button) findViewById(R.id.service_start); Button service_stop = (Button) findViewById(R.id.service_stop); //创建启动 Service 的 Intent final Intent it = new Intent(this,MsTestService.class); //为两个按钮设置点击事件,分别是启动与停止 service service_start.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startService(it); } }); service_stop.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { stopService(it); } }); } }
运行效果如下
点击开始服务
点多几下
点击停止服务
从运行结果来看
-
onBind()
方法并没有被调用,另外多次点击启动 Service, 只会重复地调用onStartCommand()
-
无论我们启动多少次 Service,一个
stopService()
就会停止 Service