編輯:初級開發
l 使用Intent物件
雖然透過Intent並非最快速,但卻是最有彈性的。無論是同一進程或是跨進程的溝通都可以使用它。例如:
/* ===== EX-02 ====== */
/* ac01.Java */
package com.misoo.pkzz;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
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, btn2, btn4;
public static ac01 appRef = null;
private final static String KKK = "AnyKey";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
appRef = this;
setContentVIEw(R.layout.main);
this.show_layout_01();
}
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);
btn2 = new Button(this);
btn2.setBackgroundResource(R.drawable.x_blue);
btn2.setText("shared data");
btn2.setOnClickListener(this);
layout.addVIEw(btn2, param);
btn4 = new Button(this);
btn4.setBackgroundResource(R.drawable.face);
btn4.setText("Exit");
btn4.setOnClickListener(this);
layout.addVIEw(btn4, param);
setContentVIEw(layout);
}
@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){
if (v == btn){
Intent intent = new Intent(Intent.ACTION_VIEW, null);
intent.putExtra(com.misoo.pkzz.ac01.KKK, "Ax004::Intent Extra Msg.");
this.startActivityForResult(intent, 0);
}
if(v.equals(btn2)){
SharedPreferences passwdfile = getSharedPreferences(
"ITEM", 0);
String im = passwdfile.getString("ITEM", null);
setTitle(im);
}
if(v.equals(btn4))
this.finish();
}
}
/* Activity_1.Java */
package com.misoo.pkzz;
import android.app.Activity;
import android.content.SharedPreferences.Editor;
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.x_yellow);
btn.setText("Edit");
btn.setOnClickListener(this);
LinearLayout.LayoutParams param = new LinearLayout.LayoutParams(150, 40);
param.topMargin = 5;
layout.addVIEw(btn, param);
setContentVIEw(layout);
//-----------------------------------
String ss = this.getIntent().getStringExtra("AnyKey");
//-----------------------------------
Editor passwdfile = getSharedPreferences("ITEM", 0).edit();
passwdfile.putString("ITEM",ss);
passwdfile.commit();
}
public void onClick(VIEw arg0) {
finish();
}
}
/* AndriodManifest.XML */
package="com.misoo.pkzz"
android:versionCode="1"
android:versionName="1.0.0">
android:label="@string/app_name">
這ac01透過Intent傳遞資料給Activity_1,而Activity_1則將之存入SharePreferences裡,再回傳給ac01類別。
<< 摘錄結語 >>
上述談到的情境是:
l 其ac01與Activity_1屬於同一個Package。
l 其ac01與Activity_1 在同一個進程裡執行,或者,各再獨立的進程裡執行。
然而,如果ac01與Activity_1分別屬於不同的Package時,又如何呢?此時,就不能藉由SharePreferences來傳遞資料了,因為SharePreferences是屬於某Package內的。至於IPC的詳細溝通法,由另外的文章說明之。
==== END ====
講義摘錄之15: 從應用框架角度看ListVIEw與Adapter類別
在android應用框架(Application Framework, 簡稱AF)裡已經設計了許多類別,其中的
三個類別如下:
圖1 AF裡的類別
這用來協助Activity在UI畫面上顯示一個List視窗,例如:
圖2 應用程式(1) 圖3 應用程式(2)
請你注意AF的特性:Activity、ListVIEw和BaseAdapter兩個類別已經由Android AF開發者設計在先。只是當時android AF開發者並不知道應用程式(Applications, 簡稱AP)裡的List視窗的內容,所以預留了空間給AP程式師去補充,如下:
圖4 應用程式師的工作
AF設計師與AP程式師兩者在不同的時間及空間(即地點)合作。AF設計師在設計AF當時並不知道AP的List視窗裡各選項的長相(文字或是圖像等),因為這長相的決定是來自於AP的用戶。所以只有AP程式師知道,AF設計師並不知道。於是,AF設計師負責撰寫AF裡的Super-class(如BaseAdapter)而AP程式師負責撰寫AP裡的Subclass(如myStringAdapter)。兩者跨時間和空間的智慧會合而成為一支完整好用的應用程式。例如,AP程式師知道他的UI將顯示出單純的文字型List視窗,所以就撰寫myStringAdapter子類別。
當應用程式執行時,AF掌握整個控制權,呼叫ac01的onCreate()函數,詢問AP程式師的見解:
圖5 AF向AP詢問
在ac01的onCreate()函數裡,AP程式師回答:由myStringAdapter子類別來提供內容及長相給ListView。於是,Activity要求顯示ListView的內容時,ListView就從BaseAdapter而反向呼叫到myStringAdapter的getVIEw()等函數,而取得顯示的內容和長相了。
圖6 AF 依據AP的回應而具有完整的執行路線
於此,請看一個簡單的android程式碼,來體會上述智慧會合的實現。此程式的畫面顯示一個單純的文字List視窗:
其程式碼如下:
/* ac01.Java */
package xom.misoo.pkzz;
import android.app.Activity;
import android.os.Bundle;
import android.view.VIEw;
import android.widget.AdapterVIEw;
import android.widget.ListVIEw;
import android.widget.TextVIEw;
import android.widget.AdapterVIEw.OnItemClickListener;
public class ac01 extends Activity implements OnItemClickListener {
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentVIEw(R.layout.main);
ListView lv = new ListVIEw(this);
lv.setAdapter(new myAdapter(this));
lv.setOnItemClickListener(this);
setContentVIEw(lv);
}
public void onItemClick(AdapterView arg0, VIEw arg1, int arg2, long arg3) {
if(arg2 == 0)
setTitle(((TextVIEw)arg1).getText());
else if(arg2 == 1)
finish();
}
}
/* myAdapter.Java */
package xom.misoo.pkzz;
import Java.util.ArrayList;
import android.content.Context;
import android.graphics.Color;
import android.view.VIEw;
import android.view.VIEwGroup;
import android.widget.BaseAdapter;
import android.widget.TextVIEw;
public class myAdapter extends BaseAdapter {
private Context ctx;
private ArrayList coll;
public myAdapter(Context context) {
ctx = context;
coll = new ArrayList();
coll.add("Hello!!");
coll.add("Exit");
}
public int getCount() {
return coll.size();
}
public Object getItem(int position) {
return coll.get(position);
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, VIEwGroup parent) {
TextVIEw tv;
if (convertVIEw == null)
tv = new TextVIEw(ctx);
else
tv = (TextView)convertVIEw;
tv.setTextColor(Color.CYAN);
tv.setHeight(45);
tv.setTextSize(26);
tv.setText(coll.get(position));
return tv;
}
}
其於,這樣的基本結構,就能進一步發展出各式各樣的Adapter了。例如ArrayAdapter、SimpleAdapter等等。於此,只節錄講義的前段基礎部份,至於後段的應用部分,就省略之。
講義摘錄之16: 善於設計自己的Listener來進行溝通
一、 你所熟悉的Listener
兩個Activity之間,或者Activity與Service之間,如果它們是在同一個進程(Process)裡,則設計Listener來進行溝通是個好方法。就像Activity與Button之間,也常常使用指令:
public class myActivity extends Activity {
public void onCreate(Bundle icicle) {
………….
Button btn1 = new Button(this);
…………
btn1.setOnClickListener(listener);
}
OnClickListener listener = new OnClickListener() {
………
};
}
這個Listener可以讓Button能將資料傳給Activity。
同樣地,我們也可以將這個技巧,應用於兩個Activity之間,或者Activity與Service之間的溝通。
二、範例程式:兩個Activity間之溝通
先執行ac01:
按下,就執行EventActivity:
輸入資料如:Happy NewYeara!!,並按下,返回到ac01:
就看到所傳來的字串了。其程式碼為:
/* aco1.Java */
package com.misoo.ppxx;
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{
private final int WC = LinearLayout.LayoutParams.WRAP_CONTENT;
private Button btn, btn2;
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
LinearLayout layout = new LinearLayout(this);
layout.setOrIEntation(LinearLayout.VERTICAL);
LinearLayout.LayoutParams param =
new LinearLayout.LayoutParams(100, WC);
param.topMargin = 5;
btn = new Button(this);
btn.setText("Go SubActivity");
btn.setOnClickListener(listener);
layout.addVIEw(btn, param);
btn2 = new Button(this);
btn2.setText("Exit");
btn2.setOnClickListener(listener);
layout.addVIEw(btn2, param);
this.setContentVIEw(layout);
EventActivity.setUpdateListener(new UpdateUIListener());
}
OnClickListener listener = new OnClickListener(){
public void onClick(VIEw v) {
if(v == btn){
Intent in = new Intent(ac01.this, EventActivity.class);
startActivity(in);
}
else if(v == btn2){
finish();
}
}
};
class UpdateUIListener implements IListener {
public void update(String s) {
setTitle(s);
}
}
}
/* EventActivity.Java */
package com.misoo.ppxx;
import android.app.Activity;
import android.os.Bundle;
import android.view.VIEw;
import android.view.VIEw.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
public class EventActivity extends Activity implements OnClickListener {
private static IListener plis;
private EditText et;
private Button btn;
public static void setUpdateListener(IListener listener) {
plis = listener;
}
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentVIEw(R.layout.event);
et=(EditText)findVIEwById(R.id.et);
btn = (Button)findVIEwById(R.id.send);
btn.setBackgroundResource(R.drawable.x_yellow);
btn.setOnClickListener(this);
}
public void onClick(VIEw v) {
plis.update(et.getText().toString());
finish();
}
}
4、點ok後,將在項目的根目錄下生成一個jocky_build.XML文件,事實上是一個ant build文件。打開這個文件,作適當修改<?XML version
上課講義之 1: 高煥堂講解 Intent-based ProgrammingAndroid的4種嫡系組件(即Activity、Service、IntentReceiv
之前采用聊天敲門的方式來介紹Socket通信,有兩個不足的地方,1.服務器會造成IO的阻塞即服務器一旦執行server.accept();將一直處於阻塞狀態,直到有客戶
最近逛其它論壇的時候看到有這樣一個問題,需要界面加載完成後自動彈出軟鍵盤。開始我認為沒有那麼麻煩,最後自己做了一個小例子,還真不好搞定,直到昨天再想這個的問題的時候,想