真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網站制作重慶分公司

android基礎知識之服務

##01_start開啟服務的生命周期(重點)

* 服務的特點:
 
        服務被創(chuàng)建時調用onCreate、onStartCommand;
           服務只能被創(chuàng)建一次,可以開啟多次onStartCommand;
           服務只能被停止一次onDestroy; 
        沒有onPause、onStop、onResume、onRestart方法,因為service沒有界面,長期運行在后臺。

* 生命周期的方法:
 
        onCreate:服務被創(chuàng)建的時候調用這個方法;
        onStartCommand :開啟服務;
        onDestroy:銷毀服務;

##02_bind方式開啟服務的生命周期(重點)

    bindService、unbindService的特點:

    1、第一次綁定服務時,先創(chuàng)建服務對象,在綁定,調用了oncreate onbind;
    2、解除綁定的服務時,調用onUnbind、onDestroy;
    3、服務只能被幫頂一次;
    4、服務只能被解除一次,多次解除程序會拋出異常;
    5、使用bindservice方式開啟的服務,會隨著界面的退出而解除綁定并且銷毀服務對象;

    生命周期:

    1、第一次綁定服務時創(chuàng)建服務對象:onCreate、onbind;
    2、界面關閉時銷毀服務對象:onUnbind、onDestroy;

    推薦的混合方式:
    1、startService:可以讓服務長期運行在后臺;
    2、bindService:綁定服務,為了調用服務的業(yè)務邏輯方法;
    3、unbindService:解除綁定,不能在調用服務里業(yè)務邏輯方法;
    4、stopService:停止服務,銷毀服務對象;

##03_為什么要引入bindservice的API

    目的:為了調用服務中業(yè)務邏輯方法:

##04_綁定服務調用服務方法的過程

    通過中間人調用服務里面的業(yè)務邏輯方法:

    1、在服務中添加一個中間人的類,這個類繼承了Binder,Binder實現了IBinder接口,所以中間人就是一個IBinder的實現類;
    2、在綁定服務時調用的onBind方法返回中間人對象;
    3、在activity中綁定服務成功時獲取中間人對象;
    4、在activity中調用中間人的方法(這個方法中調用服務的業(yè)務邏輯方法);

代碼:

MainActivity.java:

    package com.itheima.bindservice;

    import com.itheima.bindservice.TestService.MyBinder;
    
    import android.app.Activity;
    import android.content.ComponentName;
    import android.content.Intent;
    import android.content.ServiceConnection;
    import android.os.Bundle;
    import android.os.IBinder;
    import android.view.View;
    
    public class MainActivity extends Activity {

    private MyConn conn;
    private Intent intent;

    //中間人對象
    private MyBinder myBinder;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    public void call(View view) {
        myBinder.callMethodInService();
    }

    public void start(View view) {
        intent = new Intent(this, TestService.class);
        startService(intent);
    }

    public void stop(View view) {
        stopService(intent);
    }

    public void bind(View view) {
    
        conn = new MyConn();
        // 綁定服務
        // intent開啟服務的意圖對象
        // MyConn在activity與service之間創(chuàng)建的一個連接,作為通訊的渠道
        // BIND_AUTO_CREATE 綁定服務時如果服務不存在,就會縣創(chuàng)建一個服務對象,然后在綁定
        bindService(intent, conn, BIND_AUTO_CREATE);
    }

    public void unbind(View view) {
        //解除綁定
        unbindService(conn);
    }

    private class MyConn implements ServiceConnection {

        /**
         * 服務綁定成功后調用這個方法
         */
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {

            myBinder = (MyBinder) service;
        }

        /**
         * 解除服務成功時調用這個方法
         */
        @Override
        public void onServiceDisconnected(ComponentName name) {
            // TODO Auto-generated method stub
        }
    }
    }

TestService.java:

    package com.itheima.bindservice;
    
    import android.app.Service;
    import android.content.Intent;
    import android.os.Binder;
    import android.os.IBinder;
    
    public class TestService extends Service {

    /*
     * 綁定服務的時候會調用這個方法
     * return : 綁定服務成功后返回一個IBinder類型的數據對象
     */
    @Override
    public IBinder onBind(Intent arg0) {
        System.out.println("--------onBind---------");
        return new MyBinder();
    }
    
    /**
     * 解除綁定的服務時調用這個方法
     */
    @Override
    public boolean onUnbind(Intent intent) {
        System.out.println("--------onUnbind---------");
        return super.onUnbind(intent);
    }
    
    
    @Override
    public void onCreate() {
        System.out.println("--------onCreate---------");
        super.onCreate();
    }
    
    @Override
    public void onDestroy() {
        System.out.println("--------onDestroy---------");
        super.onDestroy();
    }
    
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        System.out.println("--------onStartCommand---------");
        return super.onStartCommand(intent, flags, startId);
    }
    
    /**
     * 業(yè)務邏輯方法
     */
    public void methodInService(){
        System.out.println("========methodInService========");
    }

    /**
     * 中間人,
     * @author Administrator
     *
     */
    public class MyBinder extends Binder{
        
        public void callMethodInService(){
            //調用業(yè)務邏輯方法
            methodInService();
        }
    }
    }

##05_綁定服務抽取接口(重點)

    接口的作用:對外暴露功能,隱藏實現的細節(jié);

    步驟:
    1、創(chuàng)建一個接口,里面寫一個方法(對外暴露的方法):
    2、在服務類里面,讓中間人實現這個接口,并且實現接口中方法,在實現的方法中調用服務的業(yè)務邏輯方法;
    3、在activity中綁定服務成功時,得到接口類型的中間人對象;
    4、在activity中調用中間人的方法;

代碼:

MainActivity.java:

    package com.itheima.bindservice;
    import android.app.Activity;
    import android.content.ComponentName;
    import android.content.Intent;
    import android.content.ServiceConnection;
    import android.os.Bundle;
    import android.os.IBinder;
    import android.view.View;

    public class MainActivity extends Activity {

    private MyConn conn;
    private Intent intent;
    //中間人對象
    private IService myBinder;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    
    public void call(View view) {
        myBinder.callMethodInService();
    }

    public void start(View view) {
        intent = new Intent(this, TestService.class);
        startService(intent);
    }

    public void stop(View view) {
        stopService(intent);
    }

    public void bind(View view) {
        conn = new MyConn();
        // 綁定服務
        // intent開啟服務的意圖對象
        // MyConn在activity與service之間創(chuàng)建的一個連接,作為通訊的渠道
        // BIND_AUTO_CREATE 綁定服務時如果服務不存在,就會縣創(chuàng)建一個服務對象,然后在綁定
        bindService(intent, conn, BIND_AUTO_CREATE);
    }

    public void unbind(View view) {
        //解除綁定
        unbindService(conn);
    }

    private class MyConn implements ServiceConnection {

        /**
         * 服務綁定成功后調用這個方法
         */
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            myBinder = (IService) service;
        }

        /**
         * 解除服務成功時調用這個方法
         */
        @Override
        public void onServiceDisconnected(ComponentName name) {
            // TODO Auto-generated method stub
        }
    }
    }


TestService.java:

    package com.itheima.bindservice;
    
    import android.app.Service;
    import android.content.Intent;
    import android.os.Binder;
    import android.os.IBinder;
    
    public class TestService extends Service {

    /*
     * 綁定服務的時候會調用這個方法
     * return : 綁定服務成功后返回一個IBinder類型的數據對象
     */
    @Override
    public IBinder onBind(Intent arg0) {
        System.out.println("--------onBind---------");
        return new MyBinder();
    }
    
    /**
     * 解除綁定的服務時調用這個方法
     */
    @Override
    public boolean onUnbind(Intent intent) {
        System.out.println("--------onUnbind---------");
        return super.onUnbind(intent);
    }
    
    
    @Override
    public void onCreate() {
        System.out.println("--------onCreate---------");
        super.onCreate();
    }
    
    @Override
    public void onDestroy() {
        System.out.println("--------onDestroy---------");
        super.onDestroy();
    }
    
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        System.out.println("--------onStartCommand---------");
        return super.onStartCommand(intent, flags, startId);
    }
    
    /**
     * 業(yè)務邏輯方法
     */
    public void methodInService(){
        System.out.println("========methodInService========");
    }

    /**
     * 中間人,
     * @author Administrator
     *
     */
    private class MyBinder extends Binder implements IService{
        
        //實現接口中方法
        public void callMethodInService(){
            //調用業(yè)務邏輯方法
            methodInService();
        }
        
        public void eat(){
            System.out.println("=======eat======");
        }
        
        public void sn(){
            System.out.println("=======sn======");
        }
        
        public void ktv(){
            System.out.println("=======ktv======");
        }
        }
    }

##06_服務的應用場景

    應用場景:需要在后臺運行一個程序,需要與服務器端通訊數據;
    常見的服務應用場景:天氣預報、股票軟件;

##07_利用服務注冊廣播接收者

     使用代碼注冊廣播接收者原因:操作比較頻繁的事件,在激活廣播接收者時,需要去讀取清單文件,解析xml格式的數據,這個過程占用的資源比較大,耗時較長。

     使用代碼注冊的廣播接收者,啟動的時候比較快。

工程代碼:

* 配置文件:
    
        
        

        
        

* 代碼:

        public class MainActivity extends Activity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

            Intent intent = new Intent(this,ScreenReceiverService.class);
            startService(intent);
        }
        }


    ScreenReceiverService.java:


            package com.itheima.coderegistreceiver;
            
            import android.app.Service;
            import android.content.Intent;
            import android.content.IntentFilter;
            import android.os.IBinder;
            
            public class ScreenReceiverService extends Service {
        
            @Override
            public IBinder onBind(Intent intent) {
                // TODO Auto-generated method stub
                return null;
            }
        
            @Override
            public void onCreate() {
                super.onCreate();
                // 1、創(chuàng)建一個廣播接收者的對象
                ScreenBroadcastreceiver receiver = new ScreenBroadcastreceiver();
                // 2、為廣播接收者創(chuàng)建意圖過濾器
                IntentFilter filter = new IntentFilter();
                // 3、在意圖過濾器中設置廣播接收者需要接收的事件類型
                filter.addAction("android.intent.action.SCREEN_ON");
                filter.addAction("android.intent.action.SCREEN_OFF");
                // 4、注冊廣播接收者
                this.registerReceiver(receiver, filter);
            }
        }


##08_遠程服務aidl的寫法(重點)
    遠程服務:在同一個設備上安裝的其他應用程序,包含一個服務的應用程序。
    本地服務:在自己的應用程序中寫另一個服務的類;


    aidl: Android Interface Definition language 安卓的接口定義語言;
    這個格式的文件,就是對外共享的接口的文件,可以把這個文件拷貝任何工程里,可以調用遠程服務的接口;

    IPC: Inter Process Communication 進程間的通訊;



在本地應用程序中調用遠程的服務接口:

 步驟:
    1、寫遠程的工程,寫一個服務;
    (1)創(chuàng)建一個服務類,重寫了onBind方法;
    (2)在服務類里寫了一個中間人,繼承了Binder;
    (3)寫一個接口類,對外暴露了一個方法;
    (4)在服務類里讓中間人實現了這個接口,重寫接口的方法(在這個方法里面調用服務的業(yè)務邏輯方法);
    (5)修改IService類的格式,改成aidl格式(讓它作為一個對外開放的共享接口文件);
    (6)讓中間人繼承Stub;
    2、創(chuàng)建一個本地應用程序,調用遠程的服務接口:
    (1)創(chuàng)建一個與遠程服務相同的包名,然后把aidl文件拷貝到這個包里;
    (2)在activity中綁定服務成功時得到IService類型的中間人;
    (3)在activity中調用中間人的方法;


遠程服務:

    package com.itheima.remoteservice;

    import android.app.Service;
    import android.content.Intent;
    import android.os.IBinder;
    
    import com.itheima.remoteservice.IService.Stub;
    
    public class RemoteService extends Service {

    @Override
    public IBinder onBind(Intent intent) {
        System.out.println("=========onBind============");
        return new MyBinder();
    }
    
    public void methodInService(){
        System.out.println("================methodInService===========");
    }
    
    
    
    //中間人 繼承 Stub,能夠是進程間的通訊
    private class MyBinder extends Stub{

        @Override
        public void callMethodInService() {
            //調用服務的業(yè)務邏輯方法
            methodInService();
        }
        
    }

}


本地應用程序:


    package com.itheima.localapp;

    import android.app.Activity;
    import android.content.ComponentName;
    import android.content.Intent;
    import android.content.ServiceConnection;
    import android.os.Bundle;
    import android.os.IBinder;
    import android.os.RemoteException;
    import android.view.View;
    
    import com.itheima.remoteservice.IService;
    import com.itheima.remoteservice.IService.Stub;
    
    public class MainActivity extends Activity {

    private IService myBinder;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void bind(View view ){
        Intent intent = new Intent();
        intent.setAction("com.itheima.remoteservice.REMOTESERVICE");
        
        //綁定服務
        bindService(intent, new MyConn(), BIND_AUTO_CREATE);
    }
    
    
    public void call(View view ){
        try {
            //調用遠程服務接口的方法
            myBinder.callMethodInService();
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }
    
    private class MyConn implements ServiceConnection{

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            //把中間人作為接口來使用
            myBinder = Stub.asInterface(service);
        }

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

    }
   

創(chuàng)新互聯(lián)建站-專業(yè)網站定制、快速模板網站建設、高性價比瑪納斯網站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式瑪納斯網站制作公司更省心,省錢,快速模板網站建設找我們,業(yè)務覆蓋瑪納斯地區(qū)。費用合理售后完善,10多年實體公司更值得信賴。


網站名稱:android基礎知識之服務
文章起源:http://weahome.cn/article/jdgogj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部