編輯:初級開發
上課講義摘錄之13:android的IBinder介面及其安全性機制
Activity物件與Service物件在不同的進程(Process)裡執行,各有不同的UID(Unix user ID)。由於各自獨立執行,所以Activity物件通常依賴Intent物件去請求android啟動所需要的Service。
就Service物件的開發者而言,Activity物件是屬於外界(因為兩者在不同的進程裡執行)的軟體,也大多是別人開發的。那麼,Service物件如何確定這外來的物件是善意的呢? 這就是安全性的問題了。在Service類別裡,可以做權限的檢查,其常用指令如下圖:
當Service確認了對方的善意,就將IBinder介面的參考(Reference)傳給Activity物件。Activity物件就能透過IBinder介面去使用Binder的服務了。如下圖:
當Activity呼叫IBinder的transact()等函數時,會反向呼叫NotifyBinder子類別的onTransact()函數。此時,也可以進行安全檢驗,例如下圖裡的指令:
int uid = Binder.getCallingUID();
就能取得對方UID來檢驗它的身分等。還可以進行checkCallingPermission()等檢驗。如下圖:
經檢驗而確認來客是善意的,就啟動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傳回資料。
android系統中采用PULL技術解析XML文檔比用SAX技術性能要好得多。建議android的開發者采用PULL技術解析XML文檔。跟SAX類似,只不過PULL技
最近幾天由於項目的需要研究了一下listVIEw的滑動數據動態的更新顯示,其中需要在數據加載過程有圓形進度條的顯示,遇到的問題是進度條的顏色設置,在網上查了一些資料結合
冬天,北風吹著、雪花飄著,宅男宅女都窩在被窩裡不願出去,但是又想用電腦上個網,看看動漫、打打游戲啥的……鑽出被窩就意味著寒冷,待在被窩裡就意味著不能玩台式電腦……真的是
1.2.2 範例程式(1):採單純繼承方法1.2.2.1 撰寫步驟:Step-1: 建立android專案:Px01。Step-2: 撰寫Activity的子類別:ac