android studio 30天学习笔记-day 3 -介绍Service

Service一般都被翻译为服务的意思,在android里,service是背景执行的元件,可用於长期作业或远端处理,举个例子:Service可以在执行其他app时在背景执行音乐的播放或者档案的上传/下载之类的动作

service有两种呼叫的方式,简单来说

  1. startService():透过startService()启动Service,即使当Activity退出,也不会影响Service的执行。

  2. bindService():透过bindService()让Activity绑定Service,当Activity退出那麽Service也会终止执行。

Service的生命周期
https://ithelp.ithome.com.tw/upload/images/20210701/20138966bEhvXNC5wP.png

我用程序先呈现startService()的生命周期
首先new一个Service的类别
https://ithelp.ithome.com.tw/upload/images/20210701/20138966kyyLogMDjr.png

MyTestService

public class MyTestService extends Service {
    public MyTestService() {
    }
    //这是一开始就创建好的函式
    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
//        throw new UnsupportedOperationException("Not yet implemented");
        return null;
    }
    //下面新增
    @Override
    public void onCreate() {
        super.onCreate();
        Log.v("MyTestService","onCreate");
    }

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

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.v("MyTestService","onDestroy");
    }
}

mainactivity

    //点click1按钮会启动Service,执行MyTestService内的onCreate()、onStartCommand()
    public void click1(View view) {
        Intent intent =new Intent(this,MyTestService.class);
        startService(intent);
    }
     //点click2按钮会关闭Service後,执行MyTestService内的onDestroy()
    public void click2(View view) {
        Intent intent =new Intent(this,MyTestService.class);
        stopService(intent);
    }
}

Log结果,第一次click1会先执行MyTestService内的onCreate()、onStartCommand(),之後再点click1只会出现onStartCommand()
https://ithelp.ithome.com.tw/upload/images/20210705/20138966o5WQ8XBut9.png

bindService()的生命周期:

首先创一个ServiceConnection函式,这个函式会接收到由 MyTestService 内的onBind() 所丢出来的 Ibinder 物件,利用这 IBinder 物件取得 Service 物件,就可以直接操作 Service 内各个 public 的 method。

 private ServiceConnection mServiceConnection =new ServiceConnection() { 
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            myTestService = ((MyTestService.LocalBinder)service).getTestService();
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
        }
    };

MyTestService

public class MyTestService extends Service {
    public MyTestService() {
    }
    public class LocalBinder extends Binder //宣告一个继承 Binder 的类别 LocalBinder
    {
        MyTestService getTestService()
        {
            return  MyTestService.this;
        }
    }

    private IBinder mBinder =new LocalBinder();

    public void Msg()
    {
        Log.d("MyTestService", "Msg()");
    }
    
    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
//        throw new UnsupportedOperationException("Not yet implemented");
        return mBinder;
    }
    @Override
    public boolean onUnbind(Intent intent){
        return super.onUnbind(intent);
    }  
}

MainActivity

public class MainActivity extends AppCompatActivity {
    private MyTestService myTestService;
    private Boolean mBoo;//判断是否绑定
    private ServiceConnection mServiceConnection =new ServiceConnection() { 
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            myTestService = ((MyTestService.LocalBinder)service).getTestService();
            mBoo =true;
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            mBoo =false;
        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
     @Override
    protected void onStart() {
        super.onStart();
        Intent intent =new Intent(this,MyTestService.class);
        bindService(intent,mServiceConnection, Context.BIND_AUTO_CREATE);
    }

    @Override
    protected void onStop() {
        super.onStop();
        unbindService(mServiceConnection);
        mBoo=false;
    }
    //当mBoo有绑定 且 myTestService !=null,就执行myTestService的Msg();
    public void click1(View view) { 
        if (mBoo && myTestService !=null){
            myTestService.Msg();
        }
    }
}

Log结果
https://ithelp.ithome.com.tw/upload/images/20210705/20138966cVXAsQf7jk.png


那麽Service的介绍就到此结束~


<<:  [Day10] swift & kotlin 实作篇!(1) 开发工具与环境安装

>>:  Day03-入口管制(二)

从零开始学游戏设计:使用粒子做爆炸效果

这是 Roblox 从零开始系列,效果章节的第八个单元,今天将说明如何透过粒子来实作爆炸效果 Par...

System Design: 读书心得3

这篇的主题是因为有朋友提到 Database vs Data warehouse 的差别,所以就开始...

Day32 ( 电子元件 ) 全彩 LED 光线变化 ( 共阳极 )

全彩 LED 光线变化 ( 共阳极 ) 教学原文参考:全彩 LED 光线变化 ( 共阳极 ) 全彩 ...

JavaScript Day 11. 筛选条件 filter()

阵列中常用的方法还有 filter() 跟 map(),filter() 方法可以根据指定的筛选条件...

[DAY6]制作容器(五)

装extension的时候失败了QQ E: Unable to locate package php...