最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android IPC機(jī)制ACtivity綁定Service通信代碼實(shí)例

 更新時(shí)間:2020年09月28日 15:42:56   作者:海綿般汲取  
這篇文章主要介紹了Android IPC機(jī)制ACtivity綁定Service通信代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

Binder通信過(guò)程類似于TCP/IP服務(wù)連接過(guò)程binder四大架構(gòu)Server(服務(wù)器),Client(客戶端),ServiceManager(DNS)以及Binder驅(qū)動(dòng)(路由器)

其中Server,Client,ServiceManager運(yùn)行于用戶空間,驅(qū)動(dòng)運(yùn)行于內(nèi)核空間。這四個(gè)角色的關(guān)系和互聯(lián)網(wǎng)類似:Server是服務(wù)器,Client是客戶終端,SMgr是域名服務(wù)器(DNS),驅(qū)動(dòng)是路由器。

book.java

package com.example.android_binder_testservice;

import android.os.Parcel;
import android.os.Parcelable;

public class Book implements Parcelable {
  private String bookName;
  private String author;
  private int publishDate;

  public Book() {

  }

  public Book(String bookName, String author, int publishDate) {
    super();
    this.bookName = bookName;
    this.author = author;
    this.publishDate = publishDate;
  }

  public String getBookName() {
    return bookName;
  }

  public void setBookName(String bookName) {
    this.bookName = bookName;
  }

  public String getAuthor() {
    return author;
  }

  public void setAuthor(String author) {
    this.author = author;
  }

  public int getPublishDate() {
    return publishDate;
  }

  public void setPublishDate(int publishDate) {
    this.publishDate = publishDate;
  }

  @Override
  public int describeContents() {
    return 0;
  }

  @Override
  public void writeToParcel(Parcel out, int flags) {
    out.writeString(bookName);
    out.writeString(author);
    out.writeInt(publishDate);
    
  }
  
  
  

  public static final Parcelable.Creator<Book> CREATOR = new Creator<Book>() {
    @Override
    public Book[] newArray(int size) {
      return new Book[size];
    }


    @Override
    public Book createFromParcel(android.os.Parcel source) {
      return new Book(source);
    }
  };

  public Book(Parcel in) {
    bookName = in.readString();
    author = in.readString();
    publishDate = in.readInt();
  }
}

上面是一個(gè) 實(shí)現(xiàn)了parcelable的實(shí)體類,就是將book序列化,在putExtra到Service時(shí)會(huì)被寫入內(nèi)存加快程序速度

mainActivity.java

package com.example.android_binder_testservice;

import android.os.Bundle;
import android.util.Log;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.widget.Button;

public class MainActivity extends Activity {
  Button startServiceButton;// 啟動(dòng)服務(wù)按鈕
  Button shutDownServiceButton;// 關(guān)閉服務(wù)按鈕
  Button startBindServiceButton;// 啟動(dòng)綁定服務(wù)按鈕
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    getWidget();
    regiestListener();
  }
  public void getWidget(){
    startServiceButton = (Button) findViewById(R.id.startService);
    startBindServiceButton = (Button) findViewById(R.id.bindService);
    shutDownServiceButton = (Button) findViewById(R.id.stopService);
  }
  public void regiestListener() {
    startServiceButton.setOnClickListener(startService);
    shutDownServiceButton.setOnClickListener(shutdownService);
    startBindServiceButton.setOnClickListener(startBinderService);
  }
  /** 啟動(dòng)服務(wù)的事件監(jiān)聽(tīng) */
  public Button.OnClickListener startService = new Button.OnClickListener() {
    public void onClick(View view) {
      /** 單擊按鈕時(shí)啟動(dòng)服務(wù) */
      Intent intent = new Intent(MainActivity.this,
          CountService.class);
      startService(intent);
      
      Log.v("MainStadyServics", "start Service");
    }
  };
  /** 關(guān)閉服務(wù) */
  public Button.OnClickListener shutdownService = new Button.OnClickListener() {
    public void onClick(View view) {
      /** 單擊按鈕時(shí)啟動(dòng)服務(wù) */
      Intent intent = new Intent(MainActivity.this,
          CountService.class);
      /** 退出Activity是,停止服務(wù) */
      stopService(intent);
      Log.v("MainStadyServics", "shutDown serveice");
    }
  };
  /** 打開(kāi)綁定服務(wù)的Activity */
  public Button.OnClickListener startBinderService = new Button.OnClickListener() {
    public void onClick(View view) {
      /** 單擊按鈕時(shí)啟動(dòng)服務(wù) */
      Intent intent = new Intent(MainActivity.this, UseBrider.class);
      startActivity(intent);
      Log.v("MainStadyServics", "start Binder Service");
    }
  };

}

mainActivity中當(dāng)使用startService()啟動(dòng)Service時(shí)會(huì)調(diào)用Service的onStartCommand()

當(dāng)使用bindService()則會(huì)調(diào)用onBind()方法,可能會(huì)覺(jué)了看的又看怎么沒(méi)看到bindService()這個(gè)方法呢

重點(diǎn)在

Intent intent = new Intent(MainActivity.this, UseBrider.class);
startActivity(intent);

繼續(xù)上代碼

UseBrider.java

/** 通過(guò)bindService和unBindSerivce的方式啟動(dòng)和結(jié)束服務(wù) */
public class UseBrider extends FragmentActivity {
  /** 參數(shù)設(shè)置 */
  CountService countService;

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(new UseBriderFace(this));

    Intent intent = new Intent(UseBrider.this, CountService.class);
    intent.putExtra("book", new Book("name", "an", 1999));

    /** 進(jìn)入Activity開(kāi)始服務(wù)

     * conn
     */
    bindService(intent, conn, Context.BIND_AUTO_CREATE);

  }

  private ServiceConnection conn = new ServiceConnection() {
    /*
     * 這個(gè)方法會(huì)獲取到CountService的onBind方法中返回的Binder對(duì)象
     * 然后就可以對(duì)服務(wù)進(jìn)行某種操作了
     */
    public void onServiceConnected(ComponentName name, IBinder service) {
      // TODO Auto-generated method stub
      countService = ((CountService.ServiceBinder) service).getService();
      countService.callBack();
    }

    /** 無(wú)法獲取到服務(wù)對(duì)象時(shí)的操作 */
    public void onServiceDisconnected(ComponentName name) {
      // TODO Auto-generated method stub
      countService = null;
    }

  };

  protected void onDestroy() {
    super.onDestroy();
    this.unbindService(conn);
    Log.v("MainStadyServics", "out");
  }
}

UseBriderFace.java

public class UseBriderFace extends View{
      /**創(chuàng)建參數(shù)*/
    public UseBriderFace(Context context){
      super(context);
    }
    public void onDraw(Canvas canvas){
      canvas.drawColor(Color.WHITE);//畫白色背景
        /**繪制文字*/
      Paint textPaint = new Paint();
      textPaint.setColor(Color.RED);
      textPaint.setTextSize(30);
      canvas.drawText("使用綁定服務(wù)", 10, 30, textPaint);
      textPaint.setColor(Color.GREEN);
      textPaint.setTextSize(18);
      canvas.drawText("使用綁定服務(wù)后,這個(gè)Activity關(guān)閉后", 20, 60, textPaint);
      canvas.drawText("綁定的服務(wù)也會(huì)關(guān)閉", 5, 80, textPaint);

    }
  }

UseBriderFace.java類其實(shí)就是用java定義的布局可以用xml文件代替

countService.java

package com.example.android_binder_testservice;

/**引入包*/
import android.app.Service;// 服務(wù)的類
import android.os.IBinder;
import android.os.Parcel;
import android.os.RemoteException;
import android.os.Binder;
import android.content.Intent;
import android.util.Log;

/** 計(jì)數(shù)的服務(wù) */
public class CountService extends Service {
  private String TAG = CountService.class.getSimpleName();
  /** 創(chuàng)建參數(shù) */
  boolean threadDisable;
  int count;
  Book book;
/*
 * 當(dāng)通過(guò)bindService()啟動(dòng)CountService時(shí)會(huì)調(diào)用這個(gè)方法并返回一個(gè)ServiceBinder對(duì)象
 * 這個(gè)Binder對(duì)象封裝著一個(gè)CountService實(shí)例,
 * 客戶端就可以通過(guò)ServiceBinder對(duì)服務(wù)端進(jìn)行一些操作
 */
  public IBinder onBind(Intent intent) {
    Log.i(TAG, "onBind");
    book = intent.getParcelableExtra("book");
    return new ServiceBinder();
  }

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

  @Override
  public boolean onUnbind(Intent intent) {
    Log.i(TAG, "onUnbind");
    return super.onUnbind(intent);
  }

  @Override
  public void onRebind(Intent intent) {
    Log.i(TAG, "onRebind");
    super.onRebind(intent);
  }

  public void onCreate() {
    super.onCreate();
    /** 創(chuàng)建一個(gè)線程,每秒計(jì)數(shù)器加一,并在控制臺(tái)進(jìn)行Log輸出 */
    new Thread(new Runnable() {
      public void run() {
        while (!threadDisable) {
          try {
            Thread.sleep(1000);
          } catch (InterruptedException e) {

          }
          count++;
          Log.v("CountService", "Count is" + count);
        }
      }
    }).start();
    Log.i(TAG, "onCreate");
  }

  public void onDestroy() {
    super.onDestroy();
    /** 服務(wù)停止時(shí),終止計(jì)數(shù)進(jìn)程 */
    this.threadDisable = true;
    Log.i(TAG, "onDestroy");
  }

  public int getConunt() {
    return count;
  }
  public void callBack(){
    Log.i(TAG, "hello,i am a method of CountService");
  }

  class ServiceBinder extends Binder {
    public CountService getService() {

      return CountService.this;
    }
  }
}

代碼解釋有了,想不出來(lái)了

源碼下載地址:http://git.oschina.net/zwh_9527/Binder

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Android使用RotateImageView 旋轉(zhuǎn)ImageView

    Android使用RotateImageView 旋轉(zhuǎn)ImageView

    這篇文章主要介紹了Android使用RotateImageView 旋轉(zhuǎn)ImageView 的相關(guān)資料,需要的朋友可以參考下
    2016-01-01
  • Android6.0編程實(shí)現(xiàn)雙向通話自動(dòng)錄音功能的方法詳解

    Android6.0編程實(shí)現(xiàn)雙向通話自動(dòng)錄音功能的方法詳解

    這篇文章主要介紹了Android6.0編程實(shí)現(xiàn)雙向通話自動(dòng)錄音功能的方法,結(jié)合實(shí)例形式分析了Android錄音功能的原理、實(shí)現(xiàn)技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2017-07-07
  • Android編程下拉菜單spinner用法小結(jié)(附2則示例)

    Android編程下拉菜單spinner用法小結(jié)(附2則示例)

    這篇文章主要介紹了Android編程下拉菜單spinner用法,結(jié)合實(shí)例較為詳細(xì)的總結(jié)分析了下拉菜單Spinner的具體實(shí)現(xiàn)步驟與相關(guān)技巧,并附帶兩個(gè)示例分析其具體用法,需要的朋友可以參考下
    2015-12-12
  • Jetpack?Compose?DropdownMenu手指跟隨點(diǎn)擊顯示

    Jetpack?Compose?DropdownMenu手指跟隨點(diǎn)擊顯示

    這篇文章主要為大家介紹了Jetpack?Compose?DropdownMenu手指跟隨點(diǎn)擊位置顯示實(shí)現(xiàn)方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • Android實(shí)現(xiàn)簡(jiǎn)潔的APP登錄界面

    Android實(shí)現(xiàn)簡(jiǎn)潔的APP登錄界面

    這篇文章主要為大家詳細(xì)介紹了Android簡(jiǎn)潔登錄界面的編寫代碼,實(shí)現(xiàn)簡(jiǎn)單的登錄,用戶名密碼驗(yàn)證功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • Android自定義View繪制隨機(jī)生成圖片驗(yàn)證碼

    Android自定義View繪制隨機(jī)生成圖片驗(yàn)證碼

    這篇文章主要為大家詳細(xì)介紹了Android自定義View繪制隨機(jī)生成圖片驗(yàn)證碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • 深度剖析Android Binder IPC機(jī)制

    深度剖析Android Binder IPC機(jī)制

    Android系統(tǒng)的成功離不開(kāi)其強(qiáng)大的IPC(Inter-Process Communication)機(jī)制,其中最引人注目的就是Binder,本文將深入探討B(tài)inder的技術(shù)原理,解釋其工作方式以及相關(guān)的關(guān)鍵概念
    2023-10-10
  • Android中使用 AutoCompleteTextView 實(shí)現(xiàn)手機(jī)號(hào)格式化附帶清空歷史的操作

    Android中使用 AutoCompleteTextView 實(shí)現(xiàn)手機(jī)號(hào)格式化附帶清空歷史的操作

    有個(gè)小伙伴遇到了這樣一個(gè)問(wèn)題,就是AutoCompleteTextView實(shí)現(xiàn)自動(dòng)填充的功能。同時(shí)要具備手機(jī)格式化的功能。接下來(lái)通過(guò)本文給大家分享使用 AutoCompleteTextView 實(shí)現(xiàn)手機(jī)號(hào)格式化附帶清空歷史的操作方法,需要的朋友參考下
    2017-03-03
  • 輕松實(shí)現(xiàn)Android仿淘寶地區(qū)選擇功能

    輕松實(shí)現(xiàn)Android仿淘寶地區(qū)選擇功能

    這篇文章主要介紹了輕松實(shí)現(xiàn)Android仿淘寶地區(qū)選擇功能的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-06-06
  • Android Compose學(xué)習(xí)之繪制速度表盤

    Android Compose學(xué)習(xí)之繪制速度表盤

    這篇文章主要為大家詳細(xì)介紹了Android Compose繪制速度表盤的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解下
    2023-11-11

最新評(píng)論

潜山县| 平潭县| 仁怀市| 齐河县| 双江| 富民县| 凉城县| 抚远县| 临江市| 民乐县| 佛山市| 额尔古纳市| 临汾市| 亚东县| 南丰县| 历史| 北海市| 逊克县| 建始县| 塘沽区| 保山市| 枞阳县| 德化县| 大理市| 西丰县| 梧州市| 东安县| 乌鲁木齐县| 盘山县| 新蔡县| 永胜县| 循化| 永新县| 云阳县| 吉隆县| 常熟市| 驻马店市| 洞头县| 华安县| 岗巴县| 杭锦后旗|