关于Android中service组件的学习总结

Service是四大组件之一适用于执行不需要和用户交互且长时间运行的任务。Service默认不会再子线程中运行,也不会独立运行一个进程,它执行在UI县城中,因此service不适合执行耗时的操作,除非在service中创建子线程来完成。

Service运行不依赖任何用户界面,即使程序被切换或者打开另一个应用,service也能正常运行,除非当某个应用进程被杀掉时,对应依赖的service也会停止运行。

 

后台服务

后台交互性服务可主要体现在不同的启动服务方式上(如 startService()和bindService())

binService()可以返回一个代理对象,可以调用service中的方法和获取返回结果等操作,startservice()则不行

不可交互的后台服务即普通的Service

 

 

service的生命周期为:onCreate,onStartCommand,onDestory

使用startService()时,首次创建service会回调oncreate()方法,再回调onstartcommond()方法

当再次使用startservice()时,就只会执行一次onstartcommand()方法

当想把服务关掉时,我们会通过使用stopService()方法或stopSelf()方法,这时会回调onDestory()把服务关闭

 

不可交互后台服务一、创建服务类

//只需继承Service并实现onBind()方法

​
Public class BackGroupService extends Service{    //继承于Service
    public IBinder onBind(Intent intent) {  //实现onBind方法
        Log.e("Service","onBind");
        return null;
    }
    @Override
    public void onCreate(){         //回调onCreate
        Log.e("Service","onCreate");
        super.onCreate();
    }
    @Override
    public int onStartCommand(Intent intent,int flags,int startID){         //回调onStartCommand
        Log.e("Service","onStartCommand");
        new Thread(){        //新建子线程,于此处进行耗时操作
            @Override
            public void run(){
                while (true){
                    try{
                        Log.e("Service","doSomething");
                        Thread.sleep(2000);
                    }
                    catch(InterruptedException e){
                        e.printStackTrace();
                    }
                }
            }
        }
        .start();
        return super.onStartCommand(intent,flags,startID);
    }
    @Override
        public void onDestory(){   //回调onDestory关闭服务
            Log.e("Service","onDestory");
            super.Destory()
    }
}

​

不可交互后台服务二、配置服务

Service属于组件,必须在manifests中配置

<service android:name=".Service.BackGroupService"/>

不可交互后台服务三、启动服务和停止服务

通过两个按钮演示启动和停止服务,通过startService()启动服务,通过stopService()停止服务

public class MainActivity extends AppCompatActivity{
    Button bt_open,bt_close;
    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(saveInstanceState);
        setContentView(R.layout.activity_main);

        bt_open=(Button) findViewById(R.id.open);
        bt_close=(Button) findViewById(R.id.close);
        
        final Intent intent=new                     Intent(this,BackGroupService.class);
        
        bt_open.setOnClickListener(new View.onClickListener(){
            @Override
            public void onClick(View v){  //点击启动服务
                startService(intent);
            }
        });
        bt_close.setOnClickListener(new View.OnClickListener(){
            @Override   
            publice void onClick(View v){    //点击关闭服务
                stopService(intent);
            }
        });
    }
}

开启服务后,也可在手机设置中,通过正在运行的应用中找到服务并手动停止

Service被关机后,子线程的耗时操作其实是一直存在的,关闭子线程的方法需要通过home键关闭该应用程序

 

可交互的后台服务

可交互的后台服务是指前台页面可以调用后台服务的方法,实现步骤与不可交互后台服务一致,区别在于启动的方法和活的Service的代理对象

 一、创建服务类  //比普通service多返回一个代理对象给前台获取(即前台可获取该带对象执行后台服务的方法)

public class BackGroupService extends Service{
    @Nullable   //表示可以传入NULL值
    @Override
    public IBinder onBind(Intent intent){
        Log.e("Service","onBind");
        return new MyBinder();   //返回代理对象
    }
    class MyBinder extends Binder{    //代理类
        public void showToast(){
            Log.e("Service","showToast");
        }
        public void showList(){
            Log.e("Service","showList");
        }
    }
    @Override       //解除绑定服务时调用
    public boolean onUnbind(Intent intent){
        Log.e("Service","onUnbind");
        return super.onUnbind(intent);
    }
}

二、绑定服务和解除绑定服务

 通过两个按钮演示绑定服务和解除绑定服务,通过bindService()开启服务,通过unbindService()停止服务

publice class MainActivity extends AppCompatActivity{
    Button bt_close;
    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        bt_close=(Button) findViewById(R.id.close);
    
        bindService(intent,conn,BIND_AUTO_CREATE);

        bt_close.setOnClickListener(new View.OnClickListener(){
            @Override
            publice void onClick(conn);
                unbindService(conn);
            }
        });
    }
    ServiceConnerction conn=new ServiceConnerction(){
        @Override
        publice void onServiceConnercted(ComponentName name,IBinder service){      //拿到后台服务代理对象
            BackGroupService.MyBinder myBinder=(BackGroupService.MyBinder) service;   //调用后台服务代理对象
            myBinder.showToast();
            myBinder.showList();
        }
        @Override
        public void onServiceDisconnercted(ComponertName name){
        }
    });
}

这里的startService的区别在于多了一个ServiceConnection对象,该对象是用户绑定后台服务后,可获取后台服务代理对象的回调,我们可以通过该回调拿到后台服务的代理对象,并调用后台服务定义的方法,也就实现了后台服务和前台的交互

三、运行代码

通过打印的Log信息发现service的生命周期为:onCreate->onBind->调用后台服务的方法showToast-showList->onUnBind->onDestroy

 

 

混合型后台交互服务

startService和bindService没有关联,可以同时使用,两种启动方法结合起来就是混合型交互的后台护肤了,即可以单独运行后台服务,也可以运行后台服务中提供的方法,其完整的生命周期是:onCreate->onStartCommand->onBind->onUnBind->onDestroy

 

 

前台服务

当系统内存不足时,后台服务优先级较低的服务会被回收掉,因此像状态栏中的天气预报那样的前台服务可以一直保持运行而不被系统回收

 

 

一、创建服务类

前台服务创建即再service的基础上再创建一个Notification,再使用service的startForeground()方法即可启动为前台服务

 

启动前台服务

startService(new Intent(this,ForegroundService.class));

 

二、运行代码

启动前台服务后,将程序退出并杀掉时,通过设置->应用->选择正在运行的应用,会发现虽然程序已经退出杀掉,而服务还在进行

 

IntentService

IntentService是专门用来解决Service中不能执行耗时操作这一问题的,创建一个IntentService只要继承IntentService并覆写onHandlerIntent函数,就可以在该函数中执行耗时操作了

 

系统服务

系统服务提供例如查询WiFi,网络状态,查询电量音量,包名,application信息等相关服务

1.判断WiFi是否开启

WifiManager wn =(WifiManager) getSystemService(WIFI_SERVICE);
boolean enabled = wm.isWifiEnabled();

2.获取系统最大音量

AudioManager am = (AudioManager) gerSystemService(AUDIO_SERVICE);
int max =  am.getStreamMaxVolume(AudioManager.STREAM_SYSTEM);

3.获取当前音量

AudioManager am = (AudioManager) gerSystemService(AUDIO_SERVICE);
int current = am.getStreamMaxVolume(AudioManager.STREAM_RING);

4.判断网络是否有连接

ConnectivityManager cm = (ConnectivityManager)
getSystemService(CONNECTIVITY_SERVICE);
NetworkInfo info = cm.getActiveNetworkInfo();
boolean isAvailable = info.isAvailable();

 

参考出处

https://www.cnblogs.com/huolongluo/p/6340743.html

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值