Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 初級開發 >> Android開發教程之高煥堂-上課講義(5)

Android開發教程之高煥堂-上課講義(5)

編輯:初級開發

上課講義摘錄之13:android的IBinder介面及其安全性機制
Activity物件與Service物件在不同的進程(Process)裡執行,各有不同的UID(Unix user ID)。由於各自獨立執行,所以Activity物件通常依賴Intent物件去請求android啟動所需要的Service。

就Service物件的開發者而言,Activity物件是屬於外界(因為兩者在不同的進程裡執行)的軟體,也大多是別人開發的。那麼,Service物件如何確定這外來的物件是善意的呢? 這就是安全性的問題了。在Service類別裡,可以做權限的檢查,其常用指令如下圖:

clip_image042

當Service確認了對方的善意,就將IBinder介面的參考(Reference)傳給Activity物件。Activity物件就能透過IBinder介面去使用Binder的服務了。如下圖:

clip_image043

當Activity呼叫IBinder的transact()等函數時,會反向呼叫NotifyBinder子類別的onTransact()函數。此時,也可以進行安全檢驗,例如下圖裡的指令:

int uid = Binder.getCallingUID();

就能取得對方UID來檢驗它的身分等。還可以進行checkCallingPermission()等檢驗。如下圖:

clip_image044

經檢驗而確認來客是善意的,就啟動BinderServer(如影音播放器)來提供實質的服務。

以上是就Service的開發者角度來看Android的IBinder的安全機制的有關概念。至於android範例程式碼,在此節錄文章裡,就省略了。

講義摘錄之14: Activity之間的Inter-process溝通
在android裡,一個Package可以含有多個Activity,這些Activity可以在同一個進程(Process)裡執行;也可以在不同的進程裡執行。基於Linux的安全限制,以及進程的基本特性(例如,不同進程的位址空間是獨立的),Activity-a與Activity-b在同一個進程裡執行時,兩者溝通方便也快速。但是,當Activity-a與Activity-b分別在不同的進程裡執行時,兩者溝通就屬於IPC跨進程溝通了,不如前者方便,也慢些。例如:

/* ===== EX-01 ====== */

/* ac01.Java */

package xom.misoo.pkzz;

import android.app.Activity;

import android.content.Intent;

import android.os.Bundle;

import android.view.VIEw;

import android.view.VIEw.OnClickListener;

import android.widget.Button;

import android.widget.LinearLayout;

public class ac01 extends Activity implements OnClickListener {

private Button btn, btn4;

public static ac01 appRef = null;

private String feedback_data;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

appRef = this;

setContentVIEw(R.layout.main);

this.show_layout_01();

}

@Override

public void onResume(){

super.onResume();

setTitle(feedback_data);

}

void show_layout_01(){

LinearLayout layout = new LinearLayout(this);

layout.setOrIEntation(LinearLayout.VERTICAL);

btn = new Button(this);

btn.setBackgroundResource(R.drawable.water);

btn.setText("Edit");

btn.setOnClickListener(this);

LinearLayout.LayoutParams param = new LinearLayout.LayoutParams(150, 40);

param.topMargin = 5;

layout.addVIEw(btn, param);

btn4 = new Button(this);

btn4.setBackgroundResource(R.drawable.face);

btn4.setText("Exit");

btn4.setOnClickListener(this);

layout.addVIEw(btn4, param);

setContentVIEw(layout);

}

public void setData(String x){

feedback_data = x;

}

public void onClick(VIEw v){

if (v == btn){

Intent intent = new Intent(this, Activity_1.class);

this.startActivity(intent);

}

if(v.equals(btn4))

this.finish();

}

}

/* Activity_1.Java */

package xom.misoo.pkzz;

import android.app.Activity;

import android.os.Bundle;

import android.view.VIEw;

import android.view.VIEw.OnClickListener;

import android.widget.Button;

import android.widget.LinearLayout;

public class Activity_1 extends Activity implements OnClickListener {

private Button btn;

@Override

public void onCreate(Bundle icicle) {

super.onCreate(icicle);

LinearLayout layout = new LinearLayout(this);

layout.setOrIEntation(LinearLayout.VERTICAL);

btn = new Button(this);

btn.setBackgroundResource(R.drawable.music);

btn.setText("Edit");

btn.setOnClickListener(this);

LinearLayout.LayoutParams param = new LinearLayout.LayoutParams(150, 40);

param.topMargin = 5;

layout.addVIEw(btn, param);

setContentVIEw(layout);

ac01.appRef.setData("feedback from Activity_1.");

}

public void onClick(VIEw arg0) {

finish();

}

}

其中的指令:ac01.appRef.setData("feedback from Activity_1."); 只有ac01與Activity_1兩者都在同一個位址空間(即進程)才會有效。如果將androidManifest.XML裡的敘述修改為:

 

 

 

其令Activity_1在獨立的進行裡執行,則上述指令:ac01.appRef.setData("feedback from Activity_1."); 就不對了。

那麼,這種跨進程的情形下,該如何溝通呢?

l 使用SharedPreference

可以使用:

import android.content.SharedPreferences.Editor;

於是,可在Activity_1裡撰寫指令如下:

public class Activity_1 extends Activity implements OnClickListener {

private Button btn;

@Override

public void onCreate(Bundle icicle) {

super.onCreate(icicle);

…………………(省略)

Editor passwdfile = getSharedPreferences("ITEM", 0).edit();

passwdfile.putString("ITEM","feedback from Activity_1.");

passwdfile.commit();

}

…………………(省略)

}

並且,在ac01裡撰寫指令如下:

public class ac01 extends Activity implements OnClickListener {

………………………

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

………………………

}

@Override

public void onResume(){

super.onResume();

SharedPreferences passwdfile = getSharedPreferences(

"ITEM", 0);

String im = passwdfile.getString("ITEM", null);

setTitle(im);

}

…………………………

}

這樣就能Activity_1就能將資料喘地給ac01了。

上述的ac01類別還可寫為:

public class ac01 extends Activity implements OnClickListener {

……………………

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

……………………

}

………………………

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data)

{

SharedPreferences passwdfile = getSharedPreferences(

"ITEM", 0);

String im = passwdfile.getString("ITEM", null);

setTitle(im);

}

public void onClick(VIEw v){

……………………

Intent intent = new Intent(Intent.ACTION_EDIT, null);

this.startActivityForResult(intent, 0);

……………………

}

}

這兩寫法一樣都能讓Activity_1傳回資料。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved