当前位置:天才代写 > tutorial > 安卓教程 > Android 四大组件之Service

Android 四大组件之Service

2021-02-26 14:22 星期五 所属: 安卓教程 浏览:32

—修复內容逐渐—

1,Service的生命期

onCreate第一次建立service的情况下启用。

onStartCommand运行service的情况下启用。

onStart(This method was deprecated in API level 5. Implement onStartCommand(Intent, int, int) instead.

onDestroy消毁的情况下启用。

2,过程优先(由高到低):(红色字体的2个过程是常常被系统软件收购 的2个过程)
    1. Foreground process 前台接待过程 客户已经实际操作的应用软件的过程.

    2. Visible process    可视性过程  客户能够见到, 但没法开展实际操作的应用软件的过程.

    3. Service process    服务项目过程  后台程序的服务项目所属的过程.(如果有Activity再前台接待,则该过程归属于前台接待过程)

    4. Background process 后台进程  降到最低应用软件, 代管到后台程序.

    5. Empty process      空过程    早已撤出的程序流程, 沒有每日任务在运作.

3,service的应用常见问题:

  1.是不是能够在service里写一些费时间实际操作? 不可以。如果有用时实际操作很有可能会造成ANR的产生。 (onReceive方式内是不是能够写用时实际操作?缘故)
       缘故是:service这种回调函数方式的编码是运作在主线任务程上的。

  2.IntentService 该服务项目早已运行了一个进程,你无须重新启动了。你需要做的事儿立即写到onHandleIntent,它会在子进程里解决。

三道面试问题:

  1. service和activity的差别。
    • activity能够和客户互动,service能够在后台管理做些事儿而无需跟客户互动。
    • activity在撤出程序流程后会撤出,而针对service,要是没有表明的启用终止服务项目,那麼服务项目就沒有完毕,它仍在后台程序。
    • 较大 的差别应该是:沒有服务项目运作的后台进程叫后台进程,而有服务项目的后台进程叫服务项目过程。安卓手机系统的运行内存收购 常常会收购 掉优先低的后台进程。
  2. 既然程序流程早已撤出,为何还保存空过程?
    • 提升客户体验。当客户下一次运行该APP的情况下,不用再次给分派过程,节约时间,提高工作效率。仅有当内存不够时采用收购 資源。 
  3. service和进程全是在后台程序,那她们中间有什么关系?
    • service和进程并不是一个范围的物品。service是四大部件之一,是一个独特的类,在service中能够另起进程。service本身并不是运作在一个独立过程中,默认设置状况下service是运作在主线任务程中的。

service的实际应用:

  1. 在activity中运行service与终止service

  

 //运行服务项目
 Intent intent = new Intent(this,MyService.class);
 startService(intent);
 //终止服务项目
 Intent intent = new Intent(this, MyService.class);
 stopService(intent);

 

  2,activity根据关联service,能够启用服务项目内的方式(activity假如关掉得话,service也会完毕)

//在Activity中启用本地生活服务(同一个运用中的服务项目)中的方式:
//1.启用bindservice去关联服务项目,传送一个联接桥目标
//2.在service內部去承继一个Binder,完成的子类 。该子类能够随便启用service内的方//法。
//3.在onBind方式中,回到该子类的完成。
//4.当关联ok,联接桥创建取得成功以后,联接桥目标的onServiceConnected 会被启用到,  这里边会回到一个IBinder目标,该目标便是onBind回到的那一个。
//5.取得这一IBinder目标以后,强变为MyBinder接受,随后启用其方式就可以。

//关联和解绑服务项目
public void bindservice(View view){
        //关联服务项目
        Intent intent = new Intent(this, MyService.class);
        myServiceConnection = new MyServiceConnection();
        bindService(intent, myServiceConnection, BIND_AUTO_CREATE);

    }

    public void unbindservice(View view){
        //解绑服务项目
        if(myServiceConnection!=null){
            unbindService(myServiceConnection);
        }
    }
    public void callLocalServiceMetod(View view){
        //启用当地方式
        if(binder!=null){
            Log.i("MyService","启用当地方式");
            final String callParentMethod = binder.callParentMethod();
            final int count = binder.getcount();
            Toast.makeText(this,callParentMethod count,Toast.LENGTH_SHORT).show();
        }
    }
    class MyServiceConnection implements ServiceConnection{
        //服务项目创建起來的情况下启用
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            if(service!=null){
                binder = (MyService.MyBinder) service;
            }
            Log.i("MyServiceConnection","onServiceConnected");
        }
        //服务项目联接断掉的情况下启用
        //onServiceDisconnected() 在联接一切正常关掉的状况下是不容易被启用的, 该方式只在Service 被毁坏了或是被杀掉的情况下启用.
        // 比如, 服务器资源不够, 要关掉一些Services,
        // 恰好联接关联的 Service 是被关掉者之一,  这个时候onServiceDisconnected() 便会被启用。
        @Override
        public void onServiceDisconnected(ComponentName name) {
            Log.i("MyServiceConnection","onServiceDisconnected");

        }
    }

//service方式
public class MyService extends Service {
    public int count;
    public boolean flag=true;
    public MyService() {
    }
    public String getName(){
        return "I am MyService";
    }
    class MyBinder extends Binder{
        //binder是用于传送数据的
        public String callParentMethod(){
            return getName();
        }
        public int getcount(){
            return count;
        }

    }
    @Override
    public IBinder onBind(Intent intent) {
        Log.i("MyService", "onCreate");
        new Thread(){
            @Override
            public void run() {
                super.run();
                //一关联上就逐渐做服务项目
                while(flag){
                    count  ;
                    try {
                        Thread.sleep(1000);

                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    Log.i("根据关联的服务项目开始了","" count);
                }
            }
        }.start();
        //启用当地方式是的返回值
        return new MyBinder();
        //
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Log.i("MyService","onCreate");
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.i("MyService", "onDestroy");
        flag=false;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.i("MyService", "onStartCommand");
        return super.onStartCommand(intent, flags, startId);
    }
}

      3,进程间通信(IPC)(Android应用一种接口标准语言表达AIDL(Android Interface Definition Language)来公布服务项目的插口的方法来曝露服务项目插口)

进程间通信完成全过程: 
1. 界定服务项目类.
2. 界定aidl插口文档.
3. 在服务项目中onbind方式中回到完成aidl插口stub的目标.
4. 在另一个程序流程中启用bindService方式关联服务项目.
5. 复制aidl插口文档(包含包名)到另一个程序流程中.
6. 在onServiceConnected方式中把Ibinder目标转化成aidl插口目标.
7. 应用插口目标启用方式(到此启用到远程服务的方式, 完成进程间通信)

//被启用的远程控制service
//插口
package com.rgd.day16_bindservice;

// Declare any non-default types here with import statements

interface MyAIDLInterface {
   String callParentMethod();
   int getcount();
}
//远程控制service要写的
class MyBinder2 extends MyAIDLInterface.Stub{
        @Override
        public String callParentMethod() throws RemoteException {

            return getName();
        }

        @Override
        public int getcount() throws RemoteException {
            return count;
        }
    }
//当地启用要写的
class MyConnection implements ServiceConnection{
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            if(service!=null){
                binder = MyAIDLInterface.Stub.asInterface(service);
            }
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    }

    public void bindremoteservice(View view){
        //关联远程服务
        Intent intent = new Intent();
        intent.setAction("com.ren.myservice");
        intent.setPackage("com.rgd.day16_bindservice");
        myConnection = new MyConnection();
        bindService(intent, myConnection,BIND_AUTO_CREATE);

    }

    public void unbindremoteservice(View view){
        //解绑远程服务
        if(myConnection!=null){
            unbindService(myConnection);
        }
    }

    public void callremoteServiceMetod(View view){
        //启用远程服务的方式
        if(binder!=null){
            try {
                String s = binder.callParentMethod();
                int getcount = binder.getcount();
                Toast.makeText(this,s getcount,Toast.LENGTH_SHORT).show();
            } catch (RemoteException e) {
                e.printStackTrace();
            }

        }

    }

 

 

               

 

    关键字:

天才代写-代写联系方式