• Android基础_Service


    一.service的用途

    1.1 一种是执行长时间运行的耗时操做

    1.如网络下载、音乐播放
    2.文件系统监控等

    1.2 另一种是负责组件间的交互

    1.将某些功能以Service组件形式封装,然后提供给其他组件调用

    二.Service的生命周期

    Service不能自己启动,必须由其他应用组件来调用
    根据调用方式不同,分为两种运行模式:
    运行模式不同,其生命周期也不同

                      启动模式                                                  绑定模式

    2.1启动模式下的service,代码如下

    创建启动模式运行的Service组件:

    创建Service类,继承android.app.Service类
    在Service类中实现onStartCommand等生命周期方法
    在AndroidManifest.xml文件中配置Service组件

    public class MyFirstService extends Service {
    
        @Override
        public void onCreate() {
            super.onCreate();
            Log.i("First Service","First Service Create");
        }
    
        //启动模式下,服务在onStartCommand方法中实现
        MediaPlayer mp;
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            Log.i("First Service","First Service Running,"+intent.getStringExtra("message"));
            if(mp==null) {
                mp = new MediaPlayer();
            }
            mp.reset();
            String path= Environment.getExternalStorageDirectory().getAbsolutePath()+"/nobody.mp3";
            try {
                mp.setDataSource(path);
                mp.prepare();
                mp.start();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return START_NOT_STICKY;
        }
    
        @Override
        public void onDestroy() {
            super.onDestroy();
            Log.i("First Service","First Service Destroy");
            if(mp!=null){
                mp.stop();
                mp.release();
                mp=null;
            }
            //Intent intent=new Intent(this,MyFirstService.class);
            //startService(intent);
        }
    
        @Nullable
        @Override
        public IBinder onBind(Intent intent) {
            return null;
        }
    }
    <!--配置服务-->
            <service
                android:label="Android系统服务"
                android:enabled="true"
                android:exported="true"
                android:name="com.example.service.MyFirstService"/>

    主要业务逻辑在onStartCommand方法中实现,该方法的返回值决定了不同的Service运行模式
    START_NOT_STICKY:在Service意外被终止后将停止。适用场景:网上下载数据
    START_REDELIVER_INTENT:在Service意外被终止后将停止将自动重新运行并保证Intent被处理。适用场景:关键业务处理
    START_STICKY:确保Service一直保持启动状态,但不保证Intent执行。适用场景:后台播放音乐

    2.1.1 IntentService代码如下

    Service组件经常涉及多线程以及同步问题
    使用IntentService帮助开发人员解决多线程同步问题
    会创建一个工作队列,每次将一个Intent传递到onHandleIntent()方法,无需担心多线程同步问题。

    创建启动模式运行的IntentService组件:

    创建IntentService类,继承import android.app.IntentService;类
    在Service类中重写MyIntentService方法
    在AndroidManifest.xml文件中配置MyIntentService组件

    public class MyIntentService extends IntentService {
    
        public MyIntentService() {
            super("MyIntentService");
        }
        public MyIntentService(String name) {
            super(name);
        }
        @Override
        protected void onHandleIntent(Intent intent) {
            for(int i=1;i<=100;i++){
                Log.i("Intent Service","i="+i);
                SystemClock.sleep(100);
            }
        }
    <service
                android:name="com.example.service.MyIntentService"/>

    2.1绑定模式下的service,代码如下

    创建Service类,继承android.app.Service类
    在Service类中实现一个内部类,它继承Binder类。并在Service类的onBind()生命方法中返回该内部类对象
    在AndroidManifest.xml文件中配置Service组件

    public class MyBindService extends Service {
    
        /**
         * 这是一个重点方法,返回调用对象一个Binder对象用来调用已经定义好的服务
         * @param intent
         * @return
         */
        @Nullable
        @Override
        public IBinder onBind(Intent intent) {
            Log.i("MyBindService","MyBindService Bind");
            return new MyBinder();
        }
    
        //定义一个IBinder的实现类,在该类中实现一些具体的服务方法
        public class MyBinder extends Binder{
            public MediaPlayer mp;
            public int current=0;
            public double sum(double n1,double n2){
                return n1+n2;
            }
    
            public void playMusic(String path){
                if(mp!=null)
                    return;
                mp=new MediaPlayer();
                try {
                    mp.reset();
                    mp.setDataSource(path);
                    mp.prepare();
                    mp.start();
    
                    new Thread(new Runnable() {
                        @Override
                        public void run() {
                            while (mp!=null&&current<=mp.getDuration()){
                                current=mp.getCurrentPosition();
                                SystemClock.sleep(200);
                            }
                        }
                    }).start();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            public void stopMusic(){
                if(mp!=null){
                    mp.stop();
                    mp.release();
                    mp=null;
                }
            }
    
        }
    
       //取消Service组件的绑定
        @Override
        public boolean onUnbind(Intent intent) {
            Log.i("MyBindService","MyBindService unBind");
            return super.onUnbind(intent);
        }
    
        @Override
        public void onCreate() {
            super.onCreate();
            Log.i("MyBindService","MyBindService Create");
        }
    
        @Override
        public void onDestroy() {
            super.onDestroy();
            Log.i("MyBindService","MyBindService Destroy");
        }

    <service
                android:name="com.example.service.MyBindService"/>
  • 相关阅读:
    hdu 相遇周期
    神 上帝 以及天老爷·(递推应用)
    简单n! (本来只是一个·简单的地推,只是大数问题有点纠结·,本人用数组简单模拟了一下)
    顺序表的应用(删除链表重复元素)
    vuecli下的vuex的极简Demo(实现加1减1操作)
    vuebus全局事件中心简单Demo
    vuecli构建的项目中请求代理与项目打包
    Java 中的 static 使用之静态初始化块
    having和where的区别
    char、varchar和varchar2,以及nvarchar和nvarchar2的区别与联系
  • 原文地址:https://www.cnblogs.com/Crezy/p/8084979.html
Copyright © 2020-2023  润新知