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 的调用顺序

  1. 创建一个 空的 Android 项目 cn.twle.android.StartService

  2. MainActivity.java 目录下新建一个 Service MsTestService.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();  
        }  
    }
    
  3. 修改 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>
    
  4. 修改 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>
    
  5. 修改 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);
    
                }  
            });  
        }  
    }
    

运行效果如下

点击开始服务

点多几下

点击停止服务

从运行结果来看

  1. onBind() 方法并没有被调用,另外多次点击启动 Service, 只会重复地调用 onStartCommand()

  2. 无论我们启动多少次 Service,一个 stopService() 就会停止 Service

Android 基础教程

关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.