Android 四大組件學習Service六

來源:互聯網
上載者:User

Android 四大組件學習Service六

上幾節,我們學習如何用StartServer啟動一個服務,用bindServer去綁定一個服務,以及服務的生命週期,以及什麼是IntentService。

或許有讀者會發現,我們BindServer中的第二個參數也就是ServiceConnection這個方法在將用bindService時好像沒用到。那本節課就學習。

 

那我們先說個事,上大學的時候,我學習不好,還是那種經常曠課的同學。長期下去,老師跟前就混的不好了。 有次班裡評選黨員,我就想競爭一下,但是由於我經常不上課的同學,自然幾率就小,所以我就想到走後門。 咋給導員點錢唄,反正導員是貪官,是貪官哪有不貪的。可是我不認識導員啊,那怎麼辦? 但是我舍友那是導員之前的紅人啊,可以通過我舍友把錢給導員,然後讓導員給我整個黨員唄。

大概流程是這樣的:

那我們把這個轉化為代碼:
 

這個就相當與我們用於一個Activity去啟動一個服務,但是服務有個方法,Activity想用但是卻拿不到,只能通過第三方去幫他拿。

中Activity就是我, 而Seriver就是貪官導員,只有導員能給你一個名額讓你成為黨員,但是你不認識導員,所以就得去找你舍友,也就是導員的親信。

 

那問題現在轉話為: 我要找我舍友,也就是導員的親信了。

那兩種啟動服務的方式,那種服務當建立後能返回給你這個親信呢? 明顯startService啟動的服務是沒有的。但是bindService啟動服務有:

@Overridepublic IBinder onBind(Intent intent) {// TODO Auto-generated method stubreturn null;}

就是bindService啟動服務後,通過return傳回值,預設情況下是null的。

 

既然分析到,bindService是可以返回到服務的,擔不是服務本身,只是服務的代理而已。

 

public class MainActivity extends Activity {private Intent intent;private MyServiceConn conn;SheYou me;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);                intent = new Intent(this, DangYuanService.class);        conn = new MyServiceConn();        //綁定服務        bindService(intent, conn, BIND_AUTO_CREATE);    }        //我想成為黨員的方法    public void toDoDangyuan(View v)    {    //調用舍友的方法    me.ToBeDangYuan();    }        class MyServiceConn implements ServiceConnection    {    //當服務串連成功後調用@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {// 得到服務的代理me = (SheYou) service;}@Overridepublic void onServiceDisconnected(ComponentName name) {// TODO Auto-generated method stub}    }}

服務代碼:
public class DangYuanService extends Service {@Overridepublic IBinder onBind(Intent intent) {//返回服務的代理,也就是貪官導員的親信return new SheYou();}//舍友專屬的能給我辦黨員的方法class SheYou extends Binder{//中間中(舍友)專屬的方法,讓你成為黨員public void ToBeDangYuan(){DangYuan();}}//服務自己的方法,也即是導員的權利public void DangYuan(){Log.i(DangYuanService, 只需1000元就能成為黨員!);}}

運行效果就知道了:我舍友找到導員,導員說“只需1000元吉行”。 看看,導員多貪

 

我當時就想舉報貪官,可是我還想著畢業呢。 就沒舉報貪官。

 

接著,我們導員還有個嗜好,那就是喝酒,當然了我舍友那必須要參加的。

 

class SheYou extends Binder{//中間中(舍友)專屬的方法,讓你成為黨員public void ToBeDangYuan(){DangYuan();}public void HeJiu(){Log.i(DangYuanService, 陪導員喝酒!!!!);}}

給我舍友加上一個新方法,陪導員喝酒

 

當然了陪導員喝酒,那隻有導員的親信才能參加,像我這種層級的人,那是不能參加的。當然也就無權知道了

 

    //我想成為黨員的方法    public void toDoDangyuan(View v)    {    //調用舍友的方法    me.ToBeDangYuan();    me.HeJiu();        }
那現在我訪問喝酒的方法還是ok的。按道理我是無權知道的。 那就不行了。那就對服務修改

 

這時候我們建立一個專門只有當黨員的借口:

public interface DangYuanInterface {//只有一個方法,你能知道,那就是黨員的事情public void ToBeDangYuan();}
然後讓舍友,也就是中間人,實現這個介面

 

 

class SheYou extends Binder implements DangYuanInterface{//中間中(舍友)專屬的方法,讓你成為黨員public void ToBeDangYuan(){DangYuan();}public void HeJiu(){Log.i(DangYuanService, 陪導員喝酒!!!!);}}
然後,Activity中定義一個黨員的介面

 

 

DangYuanInterface dangyuan;

然後得到這個中間人對象:

 

 

    public void toDoDangyuan(View v)    {    //調用舍友的方法    dangyuan.ToBeDangYuan();        }        class MyServiceConn implements ServiceConnection    {    //當服務串連成功後調用@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {// 得到服務的代理dangyuan = (DangYuanInterface) service;}@Overridepublic void onServiceDisconnected(ComponentName name) {// TODO Auto-generated method stub}    }

這時候你只能知道關於黨員的事情,別的事情你無權過問。


這樣以後想需要擷取服務裡的方法,就可以通過onBind的傳回值得到服務的代理,記住不是服務的本身。通常情況下把服務的代理或者中間人,一般把中間人專屬的方法抽成介面。

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.