亚洲精品久久视频,国产夫妻在线播放,欧美激情综合亚洲一二区http://www.bjzhda.cnzh-cn曙海教育集團(tuán)論壇http://www.bjzhda.cnRss Generator By Dvbbs.Netofficeoffice@126.comimages/logo.gif曙海教育集團(tuán)論壇Android 實(shí)例http://www.martymets.com/bbs/dispbbs.asp?BoardID=45&ID=2043&Page=1wangxinxin2010-12-3 13:02:17 gn7pIoN  
f'*HP%+Y  
從前面的登錄頁面跳轉(zhuǎn)進(jìn)入添加賬單頁面.這個(gè)頁面主要是用來登記收支記錄的. R0{+Xd  
說白了就是往數(shù)據(jù)庫錄入明細(xì). n0nkv[  
w Xfy,W  
表結(jié)構(gòu)就是db.execSQL("CREATE TABLE bills (" Onby=Y o6  
"_ID INTEGER PRIMARY KEY," //id t4 h5R  
"fee integer," //費(fèi)用 ,NKDEcw]  
"acctitemid integer," //賬目類型 h?fv :^vSi  
"userid integer," //使用者 r's4 -\  
"sdate TEXT," //日期 Bglh}_X  
"stime TEXT," //時(shí)間 M {_`X  
"desc TEXT" //備注 #W'jNX,h  
");"); $UgM7V$  
Q_qc_IcM y  
可以看到主要是錄入這些數(shù)據(jù).首先是布置界面,我目前想到的用個(gè)tablelayout來布局 !2$O^ }6"  
最后布局就是如下圖這樣 Z Oyq{w!2  
#*1\h=bzmW  
圖1 gfFP-J3cN  
rW&8#&  
gNo.&G [  
/t(dhz&xN  
b-;+&Rb  
在這兒我首先需要設(shè)置賬目,前面我們已經(jīng)初始化過賬目的數(shù)據(jù). 8 U B?X  
賬目應(yīng)該是一個(gè)ExpandableListActivity 2層的結(jié)構(gòu).需要從數(shù)據(jù)庫里面讀取.我在賬目后面放了一個(gè)editview 只讀沒有光標(biāo)的.也就是在這兒不可錄入,在該editview的onclick事件里面我們打開賬目選擇界面.如下圖 tHJ#2X#Y.  
=k 2In_  
圖2 賬目選擇 0' @^PzX  
(B}+uI{  
k"LbB#Q  
ZYos.ay  
I;S[Ft8d  
在這個(gè)界面中點(diǎn)擊子節(jié)點(diǎn)就返回前面界面,把選擇的賬目傳遞過去.在這有個(gè)問題,如果用戶需要錄入的賬目沒有怎么辦? ik=~`3Zp0  
所以我這沒有用dialog方式而是用了ExpandableListActivity在這個(gè)界面中如果長(zhǎng)點(diǎn)某個(gè)子節(jié)點(diǎn)就彈出管理賬目菜單, \`-/\N  
來維護(hù)賬目,如下圖所示: OQ;DqV  
圖3賬目選擇菜單示意 圖4 編輯賬目 ^z-e"  
`7zz&f9dDX  
,a9<\bd)  
HF" v \  
C\Qor3];  
-9Wx;u4]o  
kz\ D-b  
上面這些流程說起來很簡(jiǎn)單,可是當(dāng)我用andriod編寫時(shí),遇到了很多問題,不過一個(gè)個(gè)都被我解決了,這正是編程的快樂所在. `VCU`Y  
關(guān)于ExpandableListActivity 大家可以參考android 里面apidemos 里面ExpandableList1,ExpandableList2,ExpandableList3 =/&ob%J)9]  
這里面對(duì)熟悉這個(gè)ui還是很有幫助的. 在ExpandableList2 里面就是從數(shù)據(jù)庫進(jìn)行讀取的例子. 當(dāng)然android里面那個(gè)我是沒太 ER~m &JI  
看明白因?yàn)樗昧薸mport android.provider.Contacts.People; 聯(lián)系人部分的框架,而我目前對(duì)數(shù)據(jù)庫的操作和他不一樣,我都是直接 R ,-y  
sql訪問. Y O;N9wu3f  
但是你只要搞定2個(gè)cursor就ok了. Cursor groupCursor childCursor 其他都由SimpleCursorTreeAdapter幫你實(shí)現(xiàn)了. .<} (J#vC  
下面我們來看看如何使用SimpleCursorTreeAdapter t33/QW r  
//首先要實(shí)現(xiàn)groupcursor就是父節(jié)點(diǎn)游標(biāo),這個(gè)其實(shí)就是我的acctitem表的 ?W-J2tgss{  
//select * from accitem where pid is null 的結(jié)果 0 {#c  
Cursor groupCursor = billdb.getParentNode(); >MZWm6M8  
// Cache the ID column index ":E fR`A#  
mGroupIdColumnIndex = groupCursor.getColumnIndexOrThrow("_ID"); m,NUNd#)\  
// Set up our adapter 0j\?zt?  
mAdapter = new MyExpandableListAdapter(groupCursor, this, android.R.layout.simple_expandable_list_item_1, (~}IoQp>  
android.R.layout.simple_expandable_list_item_1, ]4wyuP,up  
new String[] { "NAME" }, // Name for group layouts zBD ?O!  
new int[] { android.R.id.text1 }, 8wz%e(  
new String[] { "NAME" }, // Lsa&A+fru  
new int[] { android.R.id.text1 }); Nr)v!z~y   
setListAdapter(mAdapter); spter35b[  
rUvjc4O}  
//然后我要實(shí)現(xiàn)childCursor 1M+o7HO.mG  
//其實(shí)就是select * from acctitem where id=pid 的結(jié)果 Wm>[5h%>  
public class MyExpandableListAdapter extends SimpleCursorTreeAdapter { <y#-I%ed  
public MyExpandableListAdapter(Cursor cursor, Context context, 1xN6V-qk  
int groupLayout, int childLayout, String[] groupFrom, Pf&\2_H3s9  
int[] groupTo, String[] childrenFrom, int[] childrenTo) j9"uxw@  
{ A;~lG3j4  
super(context, cursor, groupLayout, groupFrom, groupTo, c\"t+/Z  
childLayout, childrenFrom, childrenTo); +vOlA#t%Z  
} b[&A,ZPh$@  
protected Cursor getChildrenCursor(Cursor groupCursor) { m(MPVY<X  
String pid = groupCursor.getLong(mGroupIdColumnIndex) ""; $="t7C9S  
// Log.v("cola","pid=" pid); ~aKM+KmtPH  
return billdb.getChildenNode(pid); /5cFa  
} 9G njJ  
} R@*mMWW,  
//我們看看Billdbhelper里面的cursor _dQVundH  
public Cursor getParentNode(){ QwF\s13  
return db.query("acctitem", new String[]{"_id", "name" }, "pid is null", null, null, null, "pid,_id"); ;. jnRPo";  
Md!L@gX6<  
} ,3 !D(&  
xd[GJ;xvs  
public Cursor getChildenNode(String pid){ 61qs`N=k  
Log.v("cola","run getchildenNode"); KDx~^OO  
return db.query("acctitem", new String[]{"_id", "name" }, "pid=" pid, null, null, null, "_id"); +{b!,D3sa*  
} SVr3OyzI  
只要這幾步一個(gè)2級(jí)的tree list就可以出現(xiàn)了. >j5,Z]  
上面其實(shí)才是剛開始,后面我們需要使用一個(gè)自定義的Dialog 類似于一個(gè)inputBox 因?yàn)槲覀冃略鲑~目是需要輸入賬目的名稱. \BIa:}9O  
就是上面圖4表現(xiàn)的. e_eNtVq  
雖然alertDialog提供了很多方法,可以選擇list,treelist,radio, 可惜就是不能錄入text. aT9+] Ig  
這里我參考了api demos 里面的 DateWidgets1.java 和源代碼里面DatePickerDialog.java . KyQO>g{R  
我們可以從alertdialog 繼承.然后添加一個(gè)Editview 最后把數(shù)據(jù)返回出來.只要把上面我說的2個(gè)java看清楚了后處理起來就簡(jiǎn)單了. [73 \jT  
主要是一個(gè)回調(diào)函數(shù)的用法.下面看代碼 B=0U^wL  
// <F>^ffwGH-  
public class Dialog_edit extends AlertDialog implements OnClickListener { nRP|Qt7>  
private String text = ""; *=sMJY9#jE  
private EditText edit; 6Kl%|VrJs  
private OnDateSetListener mCallback; //定義回調(diào)函數(shù) cst}/8e  
private LinearLayout layout; -<g&U*/E  
public interface OnDateSetListener {//回調(diào)接口 9.:]eL  
void onDateSet(String text); 3/aK#TjK  
} >,Z[IAU.x5  
protected Dialog_edit(Context context, String title, String value, Ipp#{'Do  
OnDateSetListener Callback) { Qkvg 85  
super(context); xJ$/#UdP  
mCallback = Callback; <:n !qQS6  
TextView label = new TextView(context); { R`"Nk  
label.setText("hint"); FI(iqSJ6  
// setView(label); wHR# -g'  
edit = new EditText(context); > u!# 4  
edit.setText(value); 0| }]=XN^  
layout = new LinearLayout(context); Gp9:#L!  
layout.setOrientation(LinearLayout.VERTICAL); \C}_l+nY  
// LinearLayout.LayoutParams param = [S_qi,  
// new LinearLayout.LayoutParams(100, 40); k d9<&.y{  
// layout.addView(label, param); '* eeup  
LinearLayout.LayoutParams param2 = new LinearLayout.LayoutParams(200, y,xJ5BI$  
50); ]ft}fU5C1  
layout.addView(edit, param2); .Y5o&at6s  
//添加edit !dV2:`|+  
setView(layout); ".7\>8A#a  
setTitle(title); 6qd?&.=r  
setButton("確定", this); P47 x-;  
setButton2("取消", (OnClickListener) null); /^sk y!  
} a7}O.NDf  
public void onClick(DialogInterface dialog, int which) { uqvS  
// Log.v("cola","U click which=" which); 2&zklXuo:  
text = edit.getText().toString(); -sxu7I  
Log.v("cola", "U click text=" text); hr W2#v  
if (mCallback != null) abw5Gz@Ag  
mCallback.onDateSet(text);//使用回調(diào)返回錄入的數(shù)據(jù) @~bP|a  
} SQJ +C%   
} ^/I.? :+  
這樣我們就完成了自定義的dialog 我們可以使用它來新增和編輯賬目. 對(duì)于賬目的增刪改就是sql的事情了 LKBh{X0%(  
在這我又遇到一個(gè)問題就是我新增一個(gè)賬目后如何來刷新界面,從而反映賬目修改后的變化 S1#5oy2  
在這我開始以為只要使用getExpandableListView().invalidate(); 就可以了, =E62N7_`=  
因?yàn)槲抑霸贓xpandableList1.java例子里面,使用它可以刷新界面. tgj 5l#P  
在那個(gè)例子里面我修改了數(shù)組后調(diào)用該方法,界面就刷新了,而在這SimpleCursorTreeAdapter就行不通了,我想 *D67&/g.  

]]>
Widget開發(fā)入門-Android平臺(tái)http://www.martymets.com/bbs/dispbbs.asp?BoardID=45&ID=2042&Page=1wangxinxin2010-12-3 12:53:07
該嘰歪賬號(hào)是測(cè)試賬號(hào),用戶名是“students”,密碼是“111111” 請(qǐng)不要擅自更改。

2. 建立一個(gè)Widget
Android reference中有關(guān)于如何建立一個(gè)Widget的詳細(xì)方法,這里簡(jiǎn)要說明一下,詳情可以查看Android SDK中自帶的reference。

要建立一個(gè)Widget,分為如下幾個(gè)步驟:
(1) 創(chuàng)建一個(gè)類,讓其繼承類AppWidgetProvider,在AppWidgetProvider中有許多方法,例如onDelete(Context,int[]),onEnable(Context)等,但一般情況下我們只是覆寫onUpdate(Context,AppWidgetManager,int[])方法。在該方法中,我們啟動(dòng)后臺(tái)服務(wù)的類,一般是啟動(dòng)Thread類或者Android中的Service類。在該類中我們進(jìn)行從服務(wù)器端獲得數(shù)據(jù)并進(jìn)行處理并在Widget中顯示。

(2) 在你的AndroidMenifest.xml中添加一個(gè)receiver標(biāo)簽,讓其指向你的AppWidgetProvider子類。內(nèi)容如下:
<receiver android:name="JiwaiWidget"
android:label="@string/app_name"
android:icon="@drawable/jiwai">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data android:name="android.appwidget.provider"
            android:resource="@xml/info" />
</receiver>
對(duì)上面的代碼進(jìn)行解釋:
第一行指定該Widget的接收者是JiwaiWidget,即你建立的AppWidgetProvider子類;
第二行指定該Widget的標(biāo)簽名稱,值為value目錄下string.xml中的app_name值;
第三行指定該Widget的圖標(biāo),值為drawable目錄下jiwai圖片;
第四行-第六行是采用Android文檔中提供的;
第七行指定該Widget的描述者信息,該描述著中定義了Widget的相關(guān)信息,如該Widget的寬度、長(zhǎng)度、自動(dòng)更新的間隔時(shí)間等信息,該描述位于xml目錄下的info.xml中。

(3) 編寫你的Widget的provider文件信息(本例中是xml/info.xml)
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:minWidth="200dp"
    android:minHeight="90dp"
    android:updatePeriodMillis="43200000"
    android:initialLayout="@layout/appwidget"
    android:c>
</appwidget-provider>
其中android:updatePeriodMillis是自動(dòng)更新的時(shí)間間隔,android:initialLayout是Widget的界面描述文件。Android:configure是可選的,如果你的Widget需要在啟動(dòng)時(shí)先啟動(dòng)一個(gè)Activity,則需要設(shè)定該項(xiàng)為你的Activity。本例中,需要你的嘀咕帳號(hào)和密碼,所以應(yīng)先顯示一個(gè)Activity,輸入你的賬號(hào)和密碼,然后將得到的信息在你的Widget中顯示。

(4) 在layout目錄下編寫appwidget.xml文件,配置你的Widget的界面信息:
<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android圖片點(diǎn)擊可在新窗口打開查看rientation="vertical"
android:id="@+id/widget"
android:background="@drawable/title_a">
<LinearLayout android:layout_width="fill_parent"
android圖片點(diǎn)擊可在新窗口打開查看rientation="horizontal"
android:layout_height="wrap_content"
android:background="@drawable/title">
<TextView android:id="@+id/username_display"
android:textStyle="bold"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:textColor="#ffffff"
android:textSize="15px"
android:gravity="left|center_vertical"
android:paddingLeft="6px" />
</LinearLayout>

<LinearLayout android圖片點(diǎn)擊可在新窗口打開查看rientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">

<TextView android:id="@+id/text1"
android:layout_width="fill_parent"
android:textColor="#ffffff"
android:textSize="12px"
android:gravity="center_vertical|left"
android:paddingLeft="6px"
android:layout_height="30px">
</TextView>

<TextView android:id="@+id/text2"
android:textColor="#ffffff"
android:layout_height="30px"
android:gravity="center_vertical|left"
android:textSize="12px"
android:paddingLeft="6px"
android:layout_width="fill_parent">
</TextView>
</LinearLayout>
</LinearLayout>


該Widget中包括三個(gè)Textview,兩個(gè)用來顯示嘰歪的信息,一個(gè)用來顯示用戶名,上述代碼比較簡(jiǎn)單,故不做解釋。

(5) 由于需要一個(gè)Acvivity對(duì)象用來輸入賬戶信息,所以在layout目錄下新建一個(gè)login.xml,作為Activity的配置文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android圖片點(diǎn)擊可在新窗口打開查看rientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
android:textColor="#ff8c00"
android:capitalize="characters"
android:textStyle="bold" />

<LinearLayout android圖片點(diǎn)擊可在新窗口打開查看rientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal">

<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/user"
android:textColor="#ff8cff"
android:capitalize="characters" />

<EditText android:id="@+id/username"
android:layout_width="200px"
android:layout_height="wrap_content" />

</LinearLayout>

<LinearLayout android圖片點(diǎn)擊可在新窗口打開查看rientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal">

<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/code"
android:textColor="#ff8cff"
android:capitalize="characters" />

<EditText android:id="@+id/password"
android:layout_width="200px"
android:layout_height="wrap_content"
android:password="true" />
</LinearLayout>

<LinearLayout android圖片點(diǎn)擊可在新窗口打開查看rientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal">

<Button
    android:id="@+id/submit"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Submit"   
    />
</LinearLayout>
</LinearLayout>
有兩個(gè)EditText用來輸入用戶名和密碼,另外還有一個(gè)Button對(duì)象。
]]>
谷歌面向普通Android用戶推出應(yīng)用開發(fā)軟件http://www.martymets.com/bbs/dispbbs.asp?BoardID=45&ID=2041&Page=1wangxinxin2010-12-3 12:30:29
以下內(nèi)容含腳本,或可能導(dǎo)致頁面不正常的代碼
說明:上面顯示的是代碼內(nèi)容。您可以先檢查過代碼沒問題,或修改之后再運(yùn)行.
]]>
Android手機(jī)份額增長(zhǎng)受益于蘋果與AT&T獨(dú)家協(xié)議http://www.martymets.com/bbs/dispbbs.asp?BoardID=45&ID=2040&Page=1wangxinxin2010-12-3 12:01:52  上述兩位分析師都一致認(rèn)為,盡管Android的成功離不開Google的諸多努力措施,但有一點(diǎn)可以肯定的是,Android成功的還包括一大主要原因——那就是蘋果iPhone只能在AT&T銷售。如果iPhone能在一年之前就同時(shí)著陸Verizon,那么Android如今可能已近乎無處可去。

  在塞格勒看來,上述觀點(diǎn)除了其與比奇之外,還會(huì)有更多人贊同。

  塞格勒表示,在過去的幾年中,其已經(jīng)使用了6款不同的Android手機(jī),盡管如此,塞格勒仍無法喜歡上Android手機(jī)。如今,新版的Android手機(jī)要比iPhone面世前的各種老版手機(jī)好了上百萬倍。對(duì)此,塞格勒認(rèn)為,如果沒有iPhone的出現(xiàn),其會(huì)毫不猶豫地選擇Android手機(jī),并可能也會(huì)對(duì)Android產(chǎn)品感到滿意,但事實(shí)情況是,iPhone手機(jī)已經(jīng)面世,而且其要優(yōu)于Android,因此,塞格勒也開始動(dòng)搖對(duì)Android的信念。

  塞格勒的觀點(diǎn)是:追求最好!但是,此分析師認(rèn)為導(dǎo)致iPhone未被其視為最佳手機(jī)產(chǎn)品的主要原因就是AT&T的相關(guān)規(guī)定,并且為了擺脫這些規(guī)定,塞格勒又再次選擇了Android手機(jī),而將iPhone暫時(shí)擱置一邊。

  塞格勒還表示,盡管iPhone的好多功能和外部特征都優(yōu)于Android手機(jī),甚至有一些Android手機(jī)的忠實(shí)支持者也會(huì)認(rèn)為iPhone具有更好的用戶體驗(yàn),但這些支持者卻由于AT&T針對(duì)iPhone手機(jī)的一些規(guī)定和要求而再度選擇Android產(chǎn)品。例如,他們痛恨AT&T禁止在iPhone上使用Google Voice服務(wù),對(duì)此塞格勒本人也非常痛恨。另外,這些支持者也痛恨蘋果公司在應(yīng)用商店方面也設(shè)置重重障礙(塞格勒本人也對(duì)蘋果這些障礙政策持反對(duì)態(tài)度)。

  不過,也有多數(shù)消費(fèi)者認(rèn)為,這些都不是構(gòu)成他們不喜歡iPhone的真正原因,他們甚至?xí)䦟?duì)這些限制性措施視而不見,而他們的確不喜歡iPhone的真正原因就是因?yàn)锳T&T公司(特別是在美國市場(chǎng))。

  塞格勒總體認(rèn)為,手機(jī)市場(chǎng)的競(jìng)爭(zhēng)非常激烈,但對(duì)于iPhone登陸Verizon之后的銷量是否會(huì)大幅增長(zhǎng)以及Android手機(jī)銷量是否會(huì)因此削弱,目前仍不得而知。不管是否會(huì)有大量的Android用戶會(huì)在iPhone登陸Verizon之后轉(zhuǎn)向iPhone手機(jī),但無論如何,針對(duì)這種情形,Google一定會(huì)采取相應(yīng)的應(yīng)對(duì)措施

]]>
手機(jī)應(yīng)用程序開發(fā)者盈利的方法http://www.martymets.com/bbs/dispbbs.asp?BoardID=45&ID=2039&Page=1wangxinxin2010-12-3 12:00:36

據(jù)24次CNNIC報(bào)告,中國手機(jī)上網(wǎng)用戶為 1.81 億。其中手機(jī)上網(wǎng)人群占網(wǎng)民總數(shù)的46.0%
平均每人每天攜帶手機(jī)時(shí)間為14小時(shí),同時(shí)47.3%的用戶平均每天通過手機(jī)上網(wǎng)2小時(shí)。消費(fèi)者通過手機(jī)獲得信息的方式也被更多的人接受!手機(jī)已經(jīng)逐漸成為一種新興的媒體平臺(tái),基于這種新媒體平臺(tái)的營銷方式。
互聯(lián)網(wǎng)在中國已經(jīng)是主流媒體,影響力堪比電視,但它的廣告收入只有電視的40%(09年網(wǎng)絡(luò)廣告為260億元,同期電視廣告位654億元)。一些廣告業(yè)內(nèi)人士認(rèn)為,網(wǎng)絡(luò)廣告的價(jià)值被大大低估了。

在Iphone 和Google等等這些互聯(lián)網(wǎng)應(yīng)用功能極為強(qiáng)大智能手機(jī),大量占領(lǐng)移動(dòng)電話市場(chǎng)以后,我們有理由相信手機(jī)應(yīng)用軟件市場(chǎng)也應(yīng)運(yùn)紅火起來。
應(yīng)用程序開發(fā)者在經(jīng)歷了不小的心理起伏。能從軟件可以登錄APP store又或是安卓應(yīng)用程序市場(chǎng)銷售賺取一部分收入的欣喜,到漸漸的,他們所開發(fā)應(yīng)用程序用戶的飽和,收入銳減的失落。
以往手機(jī)應(yīng)用程序開發(fā)者從應(yīng)用程序銷售平臺(tái)能賺取的收入是有限的。不論所開發(fā)的程序在用戶的日常生活中有多么的價(jià)值,每天使用的頻率有多么頻繁,使用時(shí)間有多長(zhǎng),畢竟從全體手機(jī)用戶的數(shù)量角度上講對(duì)于該程序的認(rèn)知是很有限的。應(yīng)用程序的消費(fèi)者在為購買該程序的使用權(quán)一次性支付費(fèi)用后,開發(fā)者就將不會(huì)從該手機(jī)程序中得到任何后繼收入。另外一些基于“2 8原則”位于“長(zhǎng)尾”一端的分眾程序,開發(fā)者由販?zhǔn)鄢绦蛩@得收益將更加稀少。
時(shí)代在進(jìn)步,更多的廣告主發(fā)現(xiàn)了手機(jī)對(duì)于用戶的影響之大超出通常的想象。更加在意手機(jī)終端廣告發(fā)布的有效性,于是中國覆蓋最廣的手機(jī)廣告平臺(tái)——“WOOBOO(中文名:哇棒)”應(yīng)運(yùn)而生。“WooBoo”手機(jī)廣告平臺(tái)就是順應(yīng)了移動(dòng)營銷的潮流和形式。

Wooboo手機(jī)廣告平臺(tái)是價(jià)值鏈透明、服務(wù)高效的發(fā)布平臺(tái),它采用最低的門檻和最便捷的認(rèn)證,軟件、游戲程序開發(fā)者通過和WooBoo操作系統(tǒng)的結(jié)合,植入廣告。
程序開發(fā)者可以本廣告平臺(tái)在程序中掛接廣告盈利,并可借此推廣自己的程序。而網(wǎng)站發(fā)布者通過在其網(wǎng)站上植入手機(jī)廣告輕松獲得利潤(rùn)。
例如在最流行的IPhone手機(jī)平臺(tái)的中作為開發(fā)者,只需進(jìn)行簡(jiǎn)單的配置,就可以輕松的在開發(fā)的軟件應(yīng)用或游戲中添加Wooboo目前訂制的廣告。Wooboo已經(jīng)定制好的兩種廣告類型:漸入式和嵌入式。
只需要簡(jiǎn)單五步就可以將Wooboo提供的廣告植入手機(jī)程序中:
1.注冊(cè)并獲取SDK。
1)訪問Wooboo官方網(wǎng)站http://www.wooboo.com.cn 注冊(cè)帳號(hào)。
2)登錄Wooboo帳號(hào)后,進(jìn)入會(huì)員中心。
3)選擇左側(cè)功能樹“站點(diǎn)和程序”-->“添加站點(diǎn)\程序”。
4)選擇" iPhone程序", 按照提示輸入程序相關(guān)信息,功能介紹請(qǐng)
詳細(xì)填寫(后臺(tái)自動(dòng)生成的關(guān)鍵字將有助于返回相應(yīng)的廣告),完成
后,將得到一個(gè)唯一標(biāo)識(shí)碼PublishedID和下載路徑。
注:同一程序中可以嵌入多個(gè)廣告視圖,但是需要指定同一個(gè)
Wooboo_PID。

2.添加sdk。
1)下載指定sdk程序包解壓后獲取共獲取6個(gè)程序文件,包括4個(gè).h文
件和2個(gè)lib.a靜態(tài)庫文件。
2)將這些文件添加或?qū)氲侥腁pp工程目錄下,lib.a文件請(qǐng)選擇復(fù)
制,其中l(wèi)ibSimu3_0.a用于模擬器終端,libDevice3_0.a用于真機(jī)終
端,您可以根據(jù)實(shí)際需要自行添加。
3)其次將項(xiàng)目所需framework添加到您的app中。

3.植入廣告。

4.發(fā)布程序。程序調(diào)試完成開發(fā)者就可以發(fā)布到AppStore或其他軟件商店,歡迎登錄Wooboo官方網(wǎng)站http://market.wooboo.com.cn發(fā)布最新的應(yīng)用程序。

5.激活程序。請(qǐng)到Wooboo網(wǎng)站上更新應(yīng)用程序 market URL進(jìn)行激活,網(wǎng)站會(huì)校驗(yàn)?zāi)愕某绦蛘鎸?shí)性,程序激活成功后開發(fā)者的應(yīng)用程序就能收到Wooboo提供的廣告了。

Wooboo手機(jī)廣告平臺(tái)讓開發(fā)者的應(yīng)用程序發(fā)揮更多的價(jià)值,能為開發(fā)者帶來更多切實(shí)的收益。是廣告主和程序開發(fā)者最佳的獲利平臺(tái)。]]>
Android在TQ2440開發(fā)板上的移植http://www.martymets.com/bbs/dispbbs.asp?BoardID=45&ID=2038&Page=1wangxinxin2010-12-3 11:58:071.Android已經(jīng)可以通過NFS在TQ2440開發(fā)板上運(yùn)行
二、目前缺陷
1.觸摸屏沒有校準(zhǔn)
2.Android中時(shí)鐘停止,結(jié)束zygote進(jìn)程,系統(tǒng)重啟,時(shí)鐘更新,但再次停止不動(dòng)
三、移植步驟
1、移植Android內(nèi)核到TQ2440開發(fā)板上
1、從http://code.google.com/p/android/downloads/list上下載linux-2.6.25-android-1.0_r1.tar.gz
2、將內(nèi)核解壓到用戶目錄,如/root/kernel.git
3、進(jìn)入kernel.git文件夾,如cd ~/kernel.git/
4、修改arch/arm/plat-s3c24xx/common-smdk.c文件中的nand flash分區(qū)設(shè)置,如gedit arch/arm/plat-s3c24xx/common-smdk.c
修改static struct mtd_partition smdk_default_nand_part[]結(jié)構(gòu)體為:
static struct mtd_partition smdk_default_nand_part[] = {
        [0] = {
                .name        = "TQ2440_uboot",
                .size        = 0x00040000,
                .offset        = 0x00000000,
        },
        [1] = {
                .name        = "TQ2440_kernel",
                .offset        = 0x0004C000,
                .size        = 0x00200000,
        },
        [2] = {
                .name        = "TQ2440_yaffs2",
                .offset        = 0x0024C000,
                .size        = 0x03DB0000,
        }
};
5、在http://www.codesourcery.com/gnu_toolchains/arm/portal/release644網(wǎng)站上下載IA32 GNU/Linux TAR。
6、將文件解壓到用戶目錄,如/usr/local/arm/arm-2008q3
7、進(jìn)入arm-2008q3/bin文件夾,如cd ~/arm-2008q3/bin/
8、添加當(dāng)前路徑進(jìn)入環(huán)境變量,如export PATH=$PWD圖片點(diǎn)擊可在新窗口打開查看PATH,或修改~/.bashrc文件并重新登錄
9、進(jìn)入內(nèi)核文件夾,如cd ~/kernel.git/
10、修改Makefile文件,如gedit Makefile
更改ARCH和CROSS_COMPILE
#ARCH                ?= $(SUBARCH)
ARCH                ?= arm
#CROSS_COMPILE        ?= arm-eabi-
CROSS_COMPILE        ?= arm-none-gnueabi-
11、使用make s3c2410_defconfig,默認(rèn)配置2410內(nèi)核
12、運(yùn)行make menuconfig
(1) 確保System Type ---> ARM system type ()中的內(nèi)容為Samsung S3C2410, S3C2412, S3C2413, S3C2440, S3C2442, S3C2443
(2) 確保System Type ---> S3C2410 Machines --->
SMDK2410/A9M2410被勾選
(3) 取消選擇與Goldfish相關(guān)的內(nèi)容
Device Drivers ---> Character devices ---> < > Goldfish TTY Driver
Device Drivers ---> Power supply class support ---> < >   Goldfish battery driver (NEW)
Device Drivers ---> Real Time Clock ---> < >   GOLDFISH (NEW)
Device Drivers ---> Graphics support ---> Support for frame buffer devices ---> < >   Goldfish Framebuffer
(4) 選擇S3C2410 LCD相關(guān)的內(nèi)容
Device Drivers ---> Graphics support ---> Support for frame buffer devices ---> <*>   S3C2410 LCD framebuffer support
Device Drivers ---> Graphics support --->
Bootup logo --->
   Standard black and white Linux logo
Device Drivers ---> Graphics support --->
Bootup logo --->
   Standard 16-color Linux logo
Device Drivers ---> Graphics support --->
Bootup logo --->
   Standard 224-color Linux logo
(5) 選中Android內(nèi)核必須選項(xiàng)
Kernel Features --->
Use the ARM EABI to compile the kernel
General setup --->
Use full shmem filesystem
General setup --->
Enable Android's Shared Memory Subsystem
System Type --->
Support Thumb user binaries
Device Drivers ---> Android --->
Android log driver
Device Drivers ---> Android ---> <*> Binder IPC Driver
(6) 盡量選中Android內(nèi)核可選選項(xiàng)
Device Drivers ---> Android --->
RAM buffer console
Device Drivers ---> Android --->
Android timed gpio driver
Device Drivers ---> Android --->
Only allow certain groups to create sockets
(7) 其余CONFIG選項(xiàng),如系統(tǒng)支持請(qǐng)一并選擇
CONFIG_ANDROID_POWER =y
CONFIG_ANDROID_POWER_STAT =y
CONFIG_ANDROID_POWER_ALARM =y
(可以在Kconfig文件中查找ANDROID_POWER等字段進(jìn)行選擇,或者直接修改.config文件)
13、退出并保存.config
二、移植LCD驅(qū)動(dòng)到Linux-2.6.25內(nèi)核(驟二、三、四可以參照手冊(cè),也可以參照我的其他文章)
TQ2440的LCD移植可參照本人的另外的文章:http://tq2440.5d6d.com/thread-4-1-1.html

三、移植觸摸屏驅(qū)動(dòng)到Linux-2.6.25內(nèi)核

        TQ2440的觸摸屏移植可參照本人的另外的文章:http://tq2440.5d6d.com/thread-5-1-1.html
將256行
        ts.dev->evbit[0] = BIT(EV_SYN) | BIT(EV_KEY) | BIT(EV_ABS);
        ts.dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT(BTN_TOUCH);
改為:
ts.dev->evbit[0] = BIT_MASK(EV_SYN) | BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);
ts.dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH);
四、移植網(wǎng)卡驅(qū)動(dòng)到Linux-2.6.25內(nèi)核

        TQ2440的網(wǎng)卡移植可參照本人的另外的文章:http://tq2440.5d6d.com/thread-6-1-1.html

五、制作支持ARMv4的Android根文件系統(tǒng)
1、從http://www.namipan.com/d/403e5eb ... 140f0c9222be3858a02
下載Android的ARMv4版本根文件

2、在/dev下增加null和console兩個(gè)設(shè)備節(jié)點(diǎn)
mknod -m 660 null c 1 3
mknod -m 660 console c 5 1

3、在U-boot中修改啟動(dòng)參數(shù)init為/init,完整的命令行如:

a,開機(jī)按住空格鍵
b,選[0] Set the boot parameters
c, [1] Set NFS boot parameter
d,輸入192.168.1.3(這個(gè)是你的pc的ip,我的是這個(gè)),回車
e, 輸入192.168.1.6(這個(gè)是板子ip,默認(rèn)是這個(gè)),回車,輸入255.255.255.0
f, 再選[3] Set parameter,這個(gè)很重要,輸入bootargs,回車,輸入console=ttySAC0 root=/dev/nfs init=/init nfsroot=192.168.1.3:/opt/EmbedSky/root_nfs ip=192.168.1.6:192.168.1.3:192.168.1.6:255.255.255.0:tq2440.5d6d.com:eth0圖片點(diǎn)擊可在新窗口打開查看ff
g,保存重啟

注:TQ2440自帶的內(nèi)核文件似乎在nfs啟動(dòng)上有問題,建議參照第五步驅(qū)動(dòng)網(wǎng)卡;/opt/EmbedSky/root_nfs 這個(gè)是你的nfs目錄,設(shè)置成你自己的
4、修改/init.rc文件,去除除mount tmpfs tmpfs /sqlite_stmt_journals size=4m之外的所有mount命令
系統(tǒng)制作完成,現(xiàn)在應(yīng)該可以看到漂亮的大表了。首次啟動(dòng)需要?jiǎng)?chuàng)建文件,TQ2440啟動(dòng)還是比較快的,大約2分鐘。然后每次啟動(dòng)只需要1分鐘。

后記:至此,android能夠驅(qū)動(dòng)了,由于文件系統(tǒng)太大,做成文件系統(tǒng)有70多兆,2440只有64m空間,因此只能用nfs方式。哪天有時(shí)間將文件系統(tǒng)精簡(jiǎn)一下或許能到64m一下,以后再專門寫吧!]]>
Android學(xué)習(xí)開發(fā)4--Android在C++中調(diào)用java(3)http://www.martymets.com/bbs/dispbbs.asp?BoardID=45&ID=2037&Page=1wangxinxin2010-12-3 11:51:125.2 java類的實(shí)例化
都知道java需要 obj var = new obj();這樣一個(gè)過程,我們?cè)贑++中調(diào)用java類的成員函數(shù),當(dāng)然也要先示例話一個(gè)類。
示例化的函數(shù)如下所示
jobject getInstance(JNIEnv* env, jclass obj_class)
{
    jmethodID construction_id = env->GetMethodID(obj_class, "<init>", "()V");
    jobject obj = env->NewObject(obj_class, construction_id);
    return obj;
}
這個(gè)函數(shù)中的env表示環(huán)境參數(shù),jclass表示一個(gè)java類的句柄。
jmethodID construction_id = env->GetMethodID(obj_class, "<init>", "()V");
GetMethodID的參數(shù)分別為(類句柄,方法名稱,參數(shù)名稱)
這個(gè)是為了獲取java類中某個(gè)方法的句柄,有一點(diǎn)需要特別注意的,在獲取構(gòu)造方法的句柄和別的方法的句柄是不一樣的。
獲取一般方法的句柄所填寫“方法名稱”參數(shù)直接就是這個(gè)方法的名稱,而構(gòu)造函數(shù)的話就必須填寫"<init>"。除了這點(diǎn)區(qū)別外,就沒有區(qū)別了。
而我們的“參數(shù)名稱”似乎寫的就有些奇怪了。但是細(xì)說下他的規(guī)律也就不怪了。
參數(shù)名稱的書寫規(guī)則為 (參數(shù)1類型,參數(shù)2類型….)返回類型。而相應(yīng)類型的表示如下所示
圖片點(diǎn)擊可在新窗口打開查看

比如我們要找個(gè)int func(double)類型的函數(shù),就該這么寫:
jmethodID construction_id = env->GetMethodID(obj_class, " func ", "(D)I");
找到了構(gòu)造函數(shù)的方法之后我們直接調(diào)用構(gòu)造函數(shù),然后把生成的類返回即可
jobject obj = env->NewObject(obj_class, construction_id);
其中obj_class為類的句柄construction_id為構(gòu)造函數(shù)的句柄,而類的實(shí)例被該函數(shù)返回。

5.3 調(diào)用java類的其他函數(shù)
JNIEXPORT jstring JNICALL Java_com_hm_hello_CActivityMain_stringFromJNI
(JNIEnv* env, jobject)
{
   jstring str;
   jclass java_class = env->FindClass("com/hm/hello/CForCall");
    if (java_class == 0)
    {
       return env->NewStringUTF("not find class!");
    }
   jobject java_obj = getInstance(env, java_class);
   if (java_obj == 0)
   {
       return env->NewStringUTF("not find java OBJ!");
   }
   jmethodID java_method = env->GetMethodID(java_class, "GetJavaString", "()Ljava/lang/String;");
   if(java_method == 0)
   {
       return env->NewStringUTF("not find java method!");
   }
   str = (jstring)env->CallObjectMethod(java_obj, java_method);
   return str;
}
看完了構(gòu)造函數(shù)的介紹,這段代碼其實(shí)很容易就看懂了,我們發(fā)現(xiàn)調(diào)用java中的函數(shù)的步驟無非幾步:
1找到類句柄
2找到類的方法的句柄
3實(shí)例化類
4調(diào)用實(shí)例化類的方法。
而以上代碼中只有一段沒說過,就是
jclass java_class = env->FindClass("com/hm/hello/CForCall");
看名字就知道,是在找相應(yīng)的類的句柄,其中com.hm.hello準(zhǔn)備調(diào)用類的完整包名(把.轉(zhuǎn)換為/),而CforCall就是我們要調(diào)用的類的名稱。
至此,編譯,然后在Android調(diào)試,可愛的機(jī)器人又出現(xiàn)了,哈哈,屏幕上顯示出現(xiàn)了12345,成功!

]]>
谷歌將提供Android工具用戶可自行開發(fā)應(yīng)用http://www.martymets.com/bbs/dispbbs.asp?BoardID=45&ID=2036&Page=1wangxinxin2010-12-3 11:39:47
  這款軟件名為“谷歌Android應(yīng)用發(fā)明家”(Google App Inventor for Android),在過去的一年中,谷歌一直在對(duì)該軟件進(jìn)行測(cè)試,測(cè)試者主要為各專業(yè)學(xué)生人群。谷歌稱,之所以要推出這款工具,是因?yàn)槿藗儗?duì)手機(jī)的依賴性越來越高,用戶應(yīng)該學(xué)會(huì)自己開發(fā)所需程序。

  谷歌該項(xiàng)目主管、美國麻省理工學(xué)院計(jì)算機(jī)科學(xué)專家哈羅德·阿貝爾森(Harold Abelson)稱:“該項(xiàng)目的目標(biāo)是讓普通手機(jī)用戶成為程序開發(fā)人員,而不僅僅是消費(fèi)者!

  該項(xiàng)目表明,谷歌相信開放策略有助于提升其在智能手機(jī)軟件市場(chǎng)的競(jìng)爭(zhēng)優(yōu)勢(shì)。相比之下,蘋果iPhone應(yīng)用商店則對(duì)外部開發(fā)人員制定了極為嚴(yán)格的限制措施。阿貝爾森說:“谷歌之所以能夠這樣做,前提是Android是一個(gè)開放的架構(gòu)!

  阿貝爾森還舉例道,美國舊金山大學(xué)的一名學(xué)生利用該工具創(chuàng)建了一款短信回復(fù)程序。如果在駕車時(shí)收到短信,該應(yīng)用程序就會(huì)自動(dòng)回復(fù):“我正開車,請(qǐng)不要給我發(fā)短信。”

  谷歌表示,希望為用戶,尤其是年輕用戶提供一個(gè)而簡(jiǎn)單的工具,為智能手機(jī)開發(fā)軟件。今后,隨著該工具性能的提升,目標(biāo)用戶群將有所擴(kuò)大。

  該工具是一款基于Web的應(yīng)用,僅適用于Android手機(jī)。使用前,用戶首先要登錄Gmail電子郵件帳號(hào),然后下載一款體積很小的軟件。在創(chuàng)建應(yīng)用程序時(shí),必須將Android手機(jī)通過USB與電腦相連]]>
Android應(yīng)用開發(fā)人員美國人最多黑莓和Windows Mobile應(yīng)用商店收費(fèi)最高http://www.martymets.com/bbs/dispbbs.asp?BoardID=45&ID=2035&Page=1wangxinxin2010-12-3 11:36:43 Android應(yīng)用開發(fā)人員美國人最多
 根據(jù)Distimo(應(yīng)用商店分析工具提供商)近日發(fā)布的,12月份關(guān)于Android應(yīng)用開發(fā)人員的調(diào)查,結(jié)果顯示有65%來自美國本土。其實(shí)稍加思索這樣的結(jié)果就不難解釋,不同于國內(nèi)運(yùn)營商的運(yùn)營模式,美國用戶更習(xí)慣于付費(fèi)購買正版軟件應(yīng)用,而非國內(nèi)的“破解”行為,而付費(fèi)購買也正是軟件商店誕生的初衷。這顯然與國內(nèi)仍然以流量計(jì)費(fèi)的策略大相徑庭。這與Android軟件商店,在歐美地區(qū)的日均每款應(yīng)用售價(jià)偏高的結(jié)果,也是一致的。
黑莓和Windows Mobile應(yīng)用商店收費(fèi)最高
 另一方面,Distimo的報(bào)告還比較了幾大主流軟件應(yīng)用商店的售價(jià)。結(jié)果顯示最受企業(yè)用戶歡迎的手機(jī)應(yīng)用平臺(tái)黑莓和Windows Mobile,它們的應(yīng)用售價(jià)也最高。沒有意外的,共812款Windows Mobile應(yīng)用中,美國以639款再次榮膺桂冠。




  

1264632164_bFh1SY.jpg (34.57 KB)

1264632164_bFh1SY.jpg

2412298499.jpg (30.2 KB)

2412298499.jpg

]]>
谷歌Android速覽 讓移動(dòng)開發(fā)者輕松應(yīng)用http://www.martymets.com/bbs/dispbbs.asp?BoardID=45&ID=2034&Page=1wangxinxin2010-12-3 11:33:40Linux內(nèi)核的Android作為專為移動(dòng)設(shè)備開發(fā)的操作系統(tǒng),并不只限于智能手機(jī)使用,還可以用在平板電腦、電子閱讀設(shè)備、甚至上網(wǎng)本上。

  如今,Google已將大部分的Android代碼發(fā)布于Apache軟件許可協(xié)議下。Apache軟件許可協(xié)議被公認(rèn)為“企業(yè)友好”的許可證,它允許廠商擴(kuò)展 具有專利性質(zhì)的程序,而不必將擴(kuò)展的程序提交回開源社區(qū)。

  為了開發(fā)這一系統(tǒng),Google聯(lián)合了65家公司組成了一個(gè)企業(yè)聯(lián)盟并不是單槍匹馬來開發(fā)這個(gè)復(fù)雜的系統(tǒng)——Open Handset Alliance (OHA),并意欲為移動(dòng)設(shè)備制定一套開放標(biāo)準(zhǔn)。其中包括英特爾,摩托羅拉,三星,LG等。

  OHA的宗旨是制定一個(gè)開放的平臺(tái),徹底改變當(dāng)今移動(dòng)世界的操作模式。Andorid系統(tǒng)上“所有軟件生來平等”的原則給軟件的創(chuàng)作帶來了活力。這個(gè)原則意味著手機(jī)的核心程序和第三方程序享有平等的權(quán)利訪問手機(jī)的各種功能。

  作為開發(fā)人員,想去開發(fā)Android OS上的軟件,那么你則需要Android SDK。Android SDK由一套很復(fù)雜的開發(fā)工具組成。它支持所有的主要操作平臺(tái)(Windows, Mac, Linux)。 而開發(fā)軟件使用的主要語言是Java。然而,這些開發(fā)出的軟件并不是在普通的Java虛擬機(jī)上運(yùn)行,而是在一個(gè)為Andorid 特別設(shè)計(jì)的虛擬機(jī)上運(yùn)行,叫做Dalvik,它為只有有限的內(nèi)存和CPU的電池供電的移動(dòng)設(shè)備進(jìn)行了專門的優(yōu)化。這使得使用Java SE和ME編寫的Java程序和Android平臺(tái)上編寫的程序出現(xiàn)不兼容性。Android只是使用了Java語言的語法定義,它只支持提供Java SE和ME里的部分類庫和API。

  如果你認(rèn)為程序性能是頭等大事,那你需要Android NDK,它是Android SDK的一個(gè)附加工具,可以使Android程序開發(fā)人員把他們的跟性能最相關(guān)的部分代碼編譯成本地代碼。

  Dalvik虛擬機(jī)上運(yùn)行的程序一般都被打包成Dalvik(.dex)可執(zhí)行格式,這些程序適合在那些內(nèi)存和處理器受限制的系統(tǒng)上運(yùn)行。從Android 2.2 版本后,Dalvik提供了一個(gè)即時(shí)編譯器,它能使程序的執(zhí)行效率大大提高。跟大多數(shù)虛擬機(jī)上的代碼一樣,Dalvik上也有一個(gè).DEX文件反編譯器,叫做Dedexer,同樣也是個(gè)開源軟件。

  我們必須要注意一點(diǎn),Dalvik其實(shí)是使用Apache的Harmony項(xiàng)目的一個(gè)子集作為其核心類庫的。Apache Harmony是一個(gè)開源的、免費(fèi)版的Java語言實(shí)現(xiàn),它實(shí)現(xiàn)了Java SE 5和6的規(guī)范。

  新開發(fā)出的Android應(yīng)用程序,不管是免費(fèi)的還是商業(yè)的,你都可以從Android市場(chǎng)找到。 Android市場(chǎng)是一個(gè)Google開發(fā)的在線的軟件庫。 它提供了一個(gè)分類目錄,你可以把上面的應(yīng)用程序通過在線方式下載安裝到你的目標(biāo)設(shè)備上,而不需要使用PC機(jī)。 Android市場(chǎng)增長(zhǎng)迅速,目前上面已經(jīng)駐留了超過70,000個(gè)應(yīng)用軟件(截至2010年六月)。

  Android目前的版本號(hào)是Froyo,此版本做了很多的改進(jìn),加入了很多新功能。 當(dāng)然,開發(fā)人員們使用的SDK和NDK也有了很多的改進(jìn)]]>
調(diào)查顯示70%iPhone平臺(tái)應(yīng)用程序開發(fā)者有意為Android編寫程序http://www.martymets.com/bbs/dispbbs.asp?BoardID=45&ID=2033&Page=1wangxinxin2010-12-3 11:32:20據(jù)  AdMob市調(diào)機(jī)構(gòu)本周二的一份調(diào)查報(bào)告顯示,有超過70%的iPhone應(yīng)用程序開發(fā)者都有計(jì)劃在未來的半年內(nèi)為谷歌Android平臺(tái)開發(fā)應(yīng)用程序。在此期間,走多平臺(tái)應(yīng)用程序開發(fā)線路的開發(fā)者比例將由原來的31%提升到47%,其中有很大一部分開發(fā)者選擇將對(duì)Android的支持加入自己目前為其它系統(tǒng)編寫的程序中。另外,約有48%的Android應(yīng)用程序開發(fā)者則計(jì)劃將對(duì)iPhone平臺(tái)的支持加入自己的程序中。

圖片點(diǎn)擊可在新窗口打開查看

圖片點(diǎn)擊可在新窗口打開查看



目前Android平臺(tái)的開發(fā)者比例已經(jīng)略微領(lǐng)先于iPhone平臺(tái),達(dá)到了51%比48%,而且還有68%的開發(fā)者表示半年內(nèi)有可能會(huì)為Android平臺(tái)編寫應(yīng)用程序。

另外,從這次AdMob的調(diào)查報(bào)告中,我們也可以看到各平臺(tái)應(yīng)用程序開發(fā)者對(duì)自己目前所使用平臺(tái)的好惡程度。其中塞班和webOS平臺(tái)的程序開發(fā)者多數(shù)認(rèn)為自己編寫的程序比較受用戶的歡迎,并計(jì)劃編寫更多的平臺(tái)應(yīng)用程序。不過塞班平臺(tái)也是開發(fā)者最不喜愛的平臺(tái)。RIM的黑莓和J2ME平臺(tái)則相比之下受到了較多程序開發(fā)者的指摘。而Android和iPhone則是較受開發(fā)者喜愛的平臺(tái)]]>
Android應(yīng)用程序開發(fā)常見問題匯總http://www.martymets.com/bbs/dispbbs.asp?BoardID=45&ID=2032&Page=1wangxinxin2010-12-3 11:31:13
問:在平時(shí)Android開發(fā)時(shí)突然執(zhí)行程序,出現(xiàn)了 Application does not specify a android.test.InstrumentationTestRunner instrumentation or does not declare uses- libraryandroid.test.runner的錯(cuò)誤提示?
答:這主要是你在Run As中錯(cuò)誤的選擇了目標(biāo)為Android JUnit Test這項(xiàng)導(dǎo)致的,解決的方法也很簡(jiǎn)單在Run Dialog中刪除JUnit Test這條即可。

===================================================
問:出現(xiàn) NSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES的錯(cuò)誤提示怎么辦?
答:這樣的問題主要是簽名沖突 造成的,比如你使用了ADB的debug權(quán)限簽名,但后來使用標(biāo)準(zhǔn)sign簽名后再安裝同一個(gè)文件會(huì)出現(xiàn)這樣的錯(cuò)誤提示,解決的方法只有先老老實(shí)實(shí)從手機(jī) 上卸載原有版本再進(jìn)行安裝,而adb install -r參數(shù)是無法解決這個(gè)問題。

====================================================
問:裝了Android 1.5版本后,發(fā)現(xiàn)過去的ADT 0.8版本插件無法自動(dòng)更新怎么辦?
答:Google已經(jīng)將Android進(jìn)行了大的調(diào)整,我們安裝1.5版 SDK必需先先卸載過去的0.8或更早版本插件。
步驟為: 在Eclipse的菜單中找到 Help > Software Updates > Manage Configuration. 展開左邊樹圖,找到Android Editors 0.8.0.v200809220836-110569,單擊鼠標(biāo)右鍵咋彈出的菜單中選擇Uninstall即可。

=====================================================
問:使用 Eclipse+ADT開發(fā)調(diào)試Android軟件時(shí)發(fā)現(xiàn)安裝一個(gè)apk文件出錯(cuò),出現(xiàn)類似Re-installation failed due to different application signatures.You must perform a full uninstall of the application. WARNING: This will remove the application data! Please execute 'adb uninstall om.android123.Demo' in a shell.的錯(cuò)誤?
答:主要原因是ADT 插件賦予APK文件debug簽名時(shí)數(shù)字效驗(yàn)出錯(cuò)可能因?yàn)锳DT版本不同、APK不是這臺(tái)計(jì)算機(jī)生產(chǎn)的在模擬器或Android手機(jī)上,解決的方法可以直 接在真機(jī)中刪除該程序,重新執(zhí)行即可,或在shell中直接adb uninstall 后重新安裝。

=======================================================
問:Android 使用什么語言開發(fā)?
答:Android SDK僅提供了Java語言的開發(fā)包,但和Sun Java Micro Editon不兼容,需要使用Google Dalvik虛擬機(jī)可以識(shí)別的Java語言,更多參考Android SDK。目前不支持C/C++等其他語言,但通過ARM C++交叉編譯 器可以通過靜態(tài)庫方式在Android模擬器上執(zhí)行本地C++程序,但最終由于權(quán)限等問題可能無法在Android手機(jī)上使用。

========================================================
問:無法對(duì) jar 進(jìn)行簽名:java.util.zip.ZipException: invalid entry compressed size (expected xxx but got xxx bytes)怎么辦?
答:這些問題主要是由于資源文件造成的,對(duì)于android開發(fā)來說 應(yīng)該檢查res文件夾中的文件,逐個(gè)排查。這個(gè)問題可以通過升級(jí)系統(tǒng)的JDK和JRE版本來解決。。

==========================================================
問:Android程序?yàn)槭裁礇]有退出設(shè)計(jì)?
答:Google Android平臺(tái)在設(shè)計(jì)程序聲明周期上比較特殊,可能是考慮到第二次加載時(shí)保證速度的原因而沒有強(qiáng)制加入內(nèi)存釋放問題,所有的資源回收由Dalvik GC自動(dòng)完成,所以在設(shè)計(jì)開發(fā)時(shí)一定要注意Activity和 Service類的生命周期問題,顯示在最上層的窗口將有最高的優(yōu)先級(jí),當(dāng)Android操作系統(tǒng)內(nèi)存不夠用時(shí)自動(dòng)將會(huì)根據(jù)歷史棧按優(yōu)先級(jí)強(qiáng)制殺掉進(jìn)程。

===========================================================
問: 開發(fā)過程中為什么Android系統(tǒng)去除了一些實(shí)用的類,比如Base64?
答:很早在Android.Util中我們可以看到Base64編碼 類,但是到了Android 0.9時(shí)轉(zhuǎn)移到了org.apache.http中,最后到了Android 1.0時(shí)去除了,但是系統(tǒng)仍然內(nèi)部存在該類,Base64編碼除了在二進(jìn)制文件傳輸有用外,系統(tǒng)的PIN密碼框加密也采用了Base64編碼,最終還是去 除了,我們可以通過自己實(shí)現(xiàn)對(duì)照表等方式來實(shí)現(xiàn)這個(gè)方法,比如在ESTMP這樣的郵件服務(wù)器中用戶名和密碼仍然需要Base64加密。

===========================================================
問:Can't upload xxx.apk問題怎么解決?
答:當(dāng)前工程在編譯后沒有生成相關(guān)apk文件,apk文件一般位于工程的bin目錄下,里面還會(huì)存 放.class文件=>dex文件。Android開發(fā)網(wǎng)提醒這類錯(cuò)誤IDE一般沒有提示錯(cuò)誤信息,如果工程不是很龐大的話,可以重新創(chuàng)建一個(gè)工程 逐一分析。
]]>
Android-用 Eclipse 開發(fā) Android 應(yīng)用程序[一] : Android開發(fā)討論http://www.martymets.com/bbs/dispbbs.asp?BoardID=45&ID=2031&Page=1wangxinxin2010-12-3 11:29:59文章關(guān)鍵詞:Android,教程,步驟,平臺(tái),示例,插件,Eclipse,市場(chǎng),兩個(gè),環(huán)境

正文:

FiledUnder
Android是Google提供的挪動(dòng)、無線、計(jì)算機(jī)和通訊平臺(tái)。經(jīng)過使用AndroidEclipse插件,可以正在強(qiáng)大的Eclipse環(huán)境中構(gòu)建Android應(yīng)用步驟。本教程先容如何用Eclipse插件AndroidDevelopmentTools進(jìn)行Android應(yīng)用步驟開發(fā),包括對(duì)Android平臺(tái)和AndroidDevelopmentTools的先容,并開發(fā)兩個(gè)示例應(yīng)用步驟。
別的,您還可以經(jīng)過教程“”,了解如何構(gòu)建一個(gè)運(yùn)轉(zhuǎn)正在Android平臺(tái)上的RSS閱讀器。



開端之前
本教程先容如何正在Eclipse環(huán)境中進(jìn)行Android應(yīng)用步驟開發(fā),包括兩個(gè)示例應(yīng)用步驟。第一個(gè)示例是一個(gè)基本的應(yīng)用步驟,觸及構(gòu)建和調(diào)試的一切階段。第二個(gè)應(yīng)用步驟示例觸及相比雙雜的Android特,包括聯(lián)系人搜索和GoogleMaps地點(diǎn)查找。要想從本教程獲得最大收益,具備挪動(dòng)開發(fā)經(jīng)驗(yàn)會(huì)有援助,但不是務(wù)必的。開發(fā)Android應(yīng)用步驟需求Java?編程技能,但是對(duì)付本教程不是務(wù)必的。

我們?yōu)槭裁匆P(guān)注Android?有兩個(gè)緣由使Android成為重要的平臺(tái)。首先,Google引進(jìn)了Android,它正在很短光 內(nèi)就獲得了市場(chǎng)的關(guān)注。Google正正在進(jìn)軍挪動(dòng)市場(chǎng)。它正在這個(gè)市場(chǎng)上接納的第一個(gè)行徑就是雄布Android和OpenHandsetAlliance,這是一個(gè)令人印象深進(jìn)的起程點(diǎn)。第二,Android不但僅是另一種包括德律風(fēng)、菜單和觸摸屏功能的挪動(dòng)平臺(tái)。您將正在本教程中了解到,Android提供了一種差別的應(yīng)用步驟開發(fā)要領(lǐng)。由于可以對(duì)懇求的作和代進(jìn)行運(yùn)轉(zhuǎn)時(shí)綁定,Android的體系結(jié)構(gòu)支撐高度可定制的軟件環(huán)境。不管是考慮市場(chǎng)要素還是Android的技術(shù)方面,它都是一個(gè)值得鉆研的平臺(tái)。
本教程分為以下幾節(jié):

本教程需求聯(lián)合使用幾種技術(shù)。
Eclipse是一個(gè)運(yùn)轉(zhuǎn)插件的平臺(tái)。您該賣安置EclipseClassic的最新版本(本教程使用V3.3.1)。
憑據(jù)中的闡明安置AndroidDeveloperTools(Eclipse插件)。
本教程中的源代片斷包括:
CommentsLeaveaReply
Name(required)

EmailAddress(required)

Website
]]>
iPhone應(yīng)用開發(fā)者開始轉(zhuǎn)向Android平http://www.martymets.com/bbs/dispbbs.asp?BoardID=45&ID=2030&Page=1wangxinxin2010-12-3 11:28:26據(jù)國外媒體報(bào)道,與蘋果應(yīng)用商店App Store相比,谷歌Android系統(tǒng)的手機(jī)應(yīng)用表現(xiàn)平淡,且對(duì)用戶購買應(yīng)用和開發(fā)人員盈利有諸多不便。但隨著谷歌Android操作系統(tǒng)的改變,越來越多的iPhone開發(fā)人員對(duì)開發(fā)Android操作系統(tǒng)應(yīng)用表示出興趣。
《紐約時(shí)報(bào)》刊文表示,盡管Android手機(jī)銷量猛增,據(jù)谷歌稱每日激活數(shù)量達(dá)2萬部,但相比蘋果App Store來說,Android手機(jī)應(yīng)用表現(xiàn)平淡。業(yè)內(nèi)人士和開發(fā)人員表示,這其中部分是由于Android Market應(yīng)用商店的一些做法阻礙了手機(jī)應(yīng)用的銷售。比如,Android使用Google自己的在線支付系統(tǒng)Google Checkout,而不是諸如貝寶等更加流行的支付系統(tǒng)。這樣,許多Android開發(fā)人員不得不免費(fèi)提供其應(yīng)用下載,靠手機(jī)廣告收回成本。
由于谷歌的操作系統(tǒng)對(duì)手機(jī)制造商免費(fèi),所以市場(chǎng)上出現(xiàn)了大量各式各樣的Android手機(jī),它們有不同屏幕尺寸、內(nèi)存容量、處理器速度和圖形顯示能力,應(yīng)用的兼容性會(huì)因此打一定折扣。比如,在摩托羅拉Droid手機(jī)中運(yùn)行很好的應(yīng)用可能會(huì)在HTC手機(jī)中遇到問題。而iPhone開發(fā)人員只需關(guān)注少數(shù)幾款產(chǎn)品:iPhone、iPod和iPad。
手機(jī)應(yīng)用開發(fā)商Rovio的一名開發(fā)人員表示:“為Android開發(fā)手機(jī)應(yīng)用要困難得多,因?yàn)槊鎸?duì)蘋果操作系統(tǒng),你只需關(guān)注一款產(chǎn)品,如iPhone。”
但是,隨著Android手機(jī)銷量持續(xù)提高,谷歌逐步對(duì)Android Market做出改進(jìn),Android手機(jī)應(yīng)用的平淡表現(xiàn)正在改變。谷歌工程師副總裁安迪·魯賓(Andy Rubin)表示,目前有27萬開發(fā)人員為Android系統(tǒng)編寫手機(jī)應(yīng)用,Android Market程序下載量已經(jīng)超過10萬次,自今年3月以來增長(zhǎng)了2倍。
開發(fā)人員也感到了這一變化!拔疫^去告訴別人我為Android系統(tǒng)編寫手機(jī)應(yīng)用,別人會(huì)用異樣的眼神看我,”手機(jī)廣告軟件公司Medialets開發(fā)人員邁克爾·諾瓦克(Michael Novak)表示,“但一年前情況就有所變化了,F(xiàn)在,人們都知道Android是什么,它開始大受歡迎!
谷歌表示未來有望在Android系統(tǒng)中引入交易功能,允許用戶在應(yīng)用中購買產(chǎn)品,以幫助開發(fā)人員更加容易地賺錢。
分析師稱,在面對(duì)Windows 7這一新的競(jìng)爭(zhēng)對(duì)手和iPhone強(qiáng)勢(shì)擴(kuò)張的情況下,如果谷歌希望Android系統(tǒng)成功就必須做出改變,確保開發(fā)人員不會(huì)對(duì)Android系統(tǒng)失去耐心。
魯賓表示,面對(duì)激烈競(jìng)爭(zhēng),谷歌并不擔(dān)心,“Android承諾不限定在單一產(chǎn)品中應(yīng)用,未來我們將會(huì)看到更多設(shè)備使用Android系統(tǒng),且數(shù)量比人們想象的還要多]]>
Android手機(jī)應(yīng)用商店步入2.0時(shí)代http://www.martymets.com/bbs/dispbbs.asp?BoardID=45&ID=2029&Page=1wangxinxin2010-12-3 11:26:38趙劍表示,面向Android市場(chǎng)推出的新版愛米吧應(yīng)用商店,已經(jīng)把重點(diǎn)放在如何解決用戶最快速度找到自己喜愛的應(yīng)用上,并在國內(nèi)APP STORE中首個(gè)拿出應(yīng)用個(gè)性化推薦解決方案。他認(rèn)為,未來針對(duì)用戶喜好的個(gè)性化推薦將會(huì)成為APP STORE主要競(jìng)爭(zhēng)的熱點(diǎn)。

市場(chǎng)競(jìng)爭(zhēng)白熱化
今年最新的IDC報(bào)告顯示,2010年第二季度全球智能手機(jī)出貨量達(dá)到6300萬臺(tái),同比增長(zhǎng)50%。同時(shí),IDC還預(yù)計(jì),中國智能手機(jī)銷量將在年內(nèi)達(dá)到2600萬部,較2009年增長(zhǎng)約50%。來自市場(chǎng)分析機(jī)構(gòu)的數(shù)據(jù)顯示,在已經(jīng)是全球第二大智能手機(jī)市場(chǎng)的中國,僅僅今年第二季度就銷售了約47.5萬部Android手機(jī),占整體銷量的7%,這個(gè)數(shù)據(jù)還不包括17.4萬部OMS智能手機(jī)。
爆發(fā)性增長(zhǎng)的市場(chǎng),以及蘋果在APP STORE上獲取的巨大商業(yè)成功,驅(qū)動(dòng)國內(nèi)包括運(yùn)營商、手機(jī)廠商以及開發(fā)者蜂擁進(jìn)入Android應(yīng)用商店這一新興領(lǐng)地。
據(jù)了解,除了目前在市場(chǎng)上可見的機(jī)鋒網(wǎng)、巴士商店、安智市場(chǎng)等12個(gè)第三方應(yīng)用商店外,包括華為、中興以及其他國內(nèi)手機(jī)廠商以及運(yùn)營商都在緊鑼密鼓的開發(fā)各自的Android應(yīng)用商店。
“所有的APP STORE都在想盡辦法圈用戶,應(yīng)用商店的安裝量決定了今后在市場(chǎng)的存活機(jī)率!壁w劍告訴記者。機(jī)鋒網(wǎng)副總裁徐威特表示,目前看來,幾家應(yīng)用商店的模式并沒有太大差異,一場(chǎng)混戰(zhàn)在所難免。

用戶體驗(yàn)進(jìn)化2.0
Android應(yīng)用商店不僅僅在爭(zhēng)奪所有能進(jìn)入用戶手機(jī)的安裝渠道,也在產(chǎn)品的用戶體驗(yàn)上做文章。今年推出的安智市場(chǎng)、掌上應(yīng)用匯等應(yīng)用商店,都在其中增加了最新應(yīng)用版本升級(jí)自動(dòng)提醒功能,由于比Android官方應(yīng)用商店更新速度快,因此吸引了一部分用戶的眼球。不過,面對(duì)海量增長(zhǎng)的應(yīng)用數(shù)量,應(yīng)用商店并沒有很好的解決方案。而數(shù)據(jù)顯示,Android應(yīng)用數(shù)量?jī)H用了3個(gè)月時(shí)間就從5萬增長(zhǎng)到了10萬。
業(yè)內(nèi)人士表示,面對(duì)海量的應(yīng)用,國內(nèi)應(yīng)用商店采用的辦法都是排名、編輯推薦和搜索,根本無法解決個(gè)性化的需求。趙劍表示,愛米吧新版本中有猜你喜歡的個(gè)性化智能推薦系統(tǒng),同時(shí)在搜索中加入了云標(biāo)簽功能,會(huì)結(jié)合所有用戶的搜索熱點(diǎn)以及用戶本身的搜索熱詞顯示關(guān)鍵詞云,為用戶提供導(dǎo)航和一鍵進(jìn)入的搜索結(jié)果。
趙劍表示,個(gè)性化推薦設(shè)計(jì)到對(duì)用戶行為的分析以及推薦算法的優(yōu)化,也是改進(jìn)應(yīng)用商店用戶體驗(yàn)的難點(diǎn)。]]>
Android入門教程(一)之------Android應(yīng)用開發(fā)入門五問http://www.martymets.com/bbs/dispbbs.asp?BoardID=45&ID=2028&Page=1wangxinxin2010-12-3 11:24:32
以下內(nèi)容含腳本,或可能導(dǎo)致頁面不正常的代碼
說明:上面顯示的是代碼內(nèi)容。您可以先檢查過代碼沒問題,或修改之后再運(yùn)行.
]]>
Android 將要遠(yuǎn)遠(yuǎn)甩開 iOS?http://www.martymets.com/bbs/dispbbs.asp?BoardID=45&ID=2027&Page=1wangxinxin2010-12-3 11:22:15平臺(tái)之爭(zhēng)永遠(yuǎn)都是最吸引口水的題材。Gartner 和 IDC 這次發(fā)布的手機(jī)系統(tǒng)市場(chǎng)份額預(yù)測(cè)可能又將讓很多人參與到這場(chǎng)平臺(tái)的爭(zhēng)論之中。昨天 Gartner 在新聞稿中說“Android 將在 2010 年成為全球第二大手機(jī)操作系統(tǒng),并將于 2014 年挑戰(zhàn) Symbian 的全球第一地位”。
  Gartner 對(duì)于各大系統(tǒng)的終端數(shù)量(萬臺(tái))及市場(chǎng)份額預(yù)測(cè)如下表所示:
系統(tǒng)
2009
2010
2011
2014
Symbian
8087.63
10766.24
14127.86
26435.18
市場(chǎng)份額(%)
46.9
40.1
34.2
30.2
Android
679.84
4746.21
9193.77
25930.64
市場(chǎng)份額(%)
3.9
17.7
22.2
29.6
Research In Motion
3434.68
4692.29
6219.82
10257.95
市場(chǎng)份額(%)
19.9
17.5
15.0
11.7
iOS
2488.98
4146.18
7074.00
13039.30
市場(chǎng)份額(%)
14.4
15.4
17.1
14.9
Windows Phone
1503.11
1268.65
2130.88
3449.02
市場(chǎng)份額(%)
8.7
4.7
5.2
3.9
其他操作系統(tǒng)
1043.19
1258.81
2601.73
8445.29
市場(chǎng)份額(%)
6.1
4.7
6.3
9.6
市場(chǎng)總量(萬臺(tái))
17237.43   
26878.37   
41348.05   
87557.38   
  根據(jù) Gartner 的預(yù)測(cè),未來的手機(jī)市場(chǎng)將主要由 Symbian、Android、RIM 和 iOS 四家所掌控,微軟寄予厚望的 Windows Phone 7 仍不被看好。當(dāng)然微軟內(nèi)部并不這樣看待,他們認(rèn)為 Windows Phone 7 的問世是給競(jìng)爭(zhēng)對(duì)手的敲響的喪鐘。
  Symbian 之所以能夠繼續(xù)保持領(lǐng)先地位,得益于 Nokia 在全球大眾市場(chǎng)的巨大份額,尤其是在低端用戶的超高份額。在接下來兩天的 Nokia World 2010 中我們將會(huì)了解到換帥之后的 Nokia 是否會(huì)對(duì) Symbian 和 Meego 兩大系統(tǒng)在未來的地位和戰(zhàn)略做出調(diào)整。
  Android 最近兩年一直發(fā)展迅猛,無數(shù)廠商都加入到 Android 的陣營一起對(duì)抗 iPhone 的超高人氣。由于這場(chǎng)戰(zhàn)爭(zhēng)是Google 聯(lián)合全球多家手機(jī)制造商對(duì)抗 Apple 一家,因此 Android 市場(chǎng)份額的節(jié)節(jié)攀升并不讓人奇怪。在Samsung、Motorola、LG、Sony Ericsson 等諸多廠商的支持下,今年年底 Android在北美的市場(chǎng)份額就將居于首位。而 iOS 雖然現(xiàn)在仍風(fēng)靡全球,創(chuàng)新不斷且搶購如潮,但是我們也可以看到越來越多的果黑出現(xiàn)。因此 Gartner認(rèn)為只有蘋果一家公司只有一款 iPhone 支撐的 iOS 份額仍會(huì)攀升,但是到 2014 年將會(huì)回落到 2010年的水平,而被搶占中低端市場(chǎng)的 Symbian 和 Android 甩在身后。
  RIM 和微軟雖然各自都研發(fā)并推出了自己的新系統(tǒng) OS6 和 WP7,但是仍然不被看好,RIM 與 iOS一樣都只有自己一家硬件品牌的支撐,但是好在 RIM 的企業(yè)用戶基數(shù)較大,因此不會(huì)下滑到如微軟這般境地——微軟屆時(shí)將被 Meego超越而居第六位。而其他如三星推出的 Bada 以及 HP 和眾多胖友寄予厚望的webOS則統(tǒng)統(tǒng)被無視了,都只能到“其他操作系統(tǒng)”中找尋一點(diǎn)自己的份額。
  但是來自 IDC 的預(yù)測(cè)則與 Gartner 不盡相同,如下表所示:
操作系統(tǒng)
2010 市場(chǎng)份額
2014 市場(chǎng)份額
2014/2010變化
Symbian
40.1%
32.9%
-18.0%
BlackBerry OS
17.9%
17.3%
-3.5%
Android
16.3%
24.6%
51.2%
iOS
14.7%
10.9%
-25.8%
Windows Mobile
6.8%
9.8%
43.3%
其他
4.2%
4.5%
8.3%
總計(jì)
100.0%
100.0%
  IDC 認(rèn)為即便到 2014 年 Android 仍難以追到 Symbian 的市場(chǎng)份額,雖然 Symbian有明顯的下滑(-18%),Android 有更顯著的爬升(51.2%)。然而雖然 Gartner 和 IDC對(duì)于具體份額預(yù)測(cè)不盡相同,但是從他們的預(yù)測(cè)數(shù)據(jù)來看,他們都認(rèn)為到 2014 年 Android 將會(huì)把 iOS 遠(yuǎn)遠(yuǎn)拋在身后。
  而對(duì)于 RIM、iOS 以及 Windows Phone 的預(yù)測(cè) IDC 則同樣與 Gartner 有不小的出入,IDC 認(rèn)為 RIM的市場(chǎng)份額基本不會(huì)發(fā)生變化,而 iOS 則將下滑 25.8%,而將與份額急劇擴(kuò)張之后的 Windows Phone 不相上下。對(duì)于 iOS的如此不看好相比會(huì)引起很多蘋果粉絲的不屑一顧,讓我們拭目以待究竟市場(chǎng)會(huì)如何變化,消費(fèi)者和開發(fā)者又會(huì)如何選擇。]]>
android 應(yīng)用類APP開發(fā)小結(jié)——android Google map 小應(yīng)用http://www.martymets.com/bbs/dispbbs.asp?BoardID=45&ID=2026&Page=1wangxinxin2010-12-3 11:20:59 

先上截圖:

 

應(yīng)用的主要功能是根據(jù)適當(dāng)?shù)那榫埃ㄈ绲攸c(diǎn),手機(jī)狀態(tài)等)為用戶自動(dòng)的切換情景模式。

比方說:手機(jī)向上是鈴音+震動(dòng),當(dāng)開會(huì)時(shí),將手機(jī)翻轉(zhuǎn),將自動(dòng)切換成靜音模式。

還可以根據(jù)經(jīng)緯度,到達(dá)一個(gè)地方后自動(dòng)切換成用戶預(yù)先設(shè)置的情景模式。

(當(dāng)然,由于沒找到合適的經(jīng)緯度換算工具,經(jīng)緯度的判斷目前只能是精確位置,不是范圍值。

因此只能算是個(gè)學(xué)習(xí)的小應(yīng)用了,實(shí)際的應(yīng)用還有待完善啊。如果有高手知道的話,麻煩告訴我下。萬分感謝)

 

-------------------------廢話不多說開始代碼部分-----------------------------------------------------

雖然是一個(gè)只有一個(gè)頁面的小應(yīng)用,但是

麻雀雖小,五臟俱全

這個(gè)應(yīng)用的功能點(diǎn)主要有:

     改變情景模式

     實(shí)時(shí)獲取地理位置

     實(shí)時(shí)判斷手機(jī)重力狀態(tài)

用到的技術(shù)包括:

1.android Google map的應(yīng)用

2.Android組件的使用
    Activity(MapActivity)
    Service
    Broadcastreceiver

3.Xml解析
4.文件存儲(chǔ)
5.傳感器使用
6.底層繪圖
7.自定義view

 

由于使回頭看代碼,我就從簡(jiǎn)單的部分一步步介紹。

 

首先是權(quán)限問題,很多新手都犯了這個(gè)毛病,程序出錯(cuò),往往是權(quán)限沒有添加。

Java代碼 復(fù)制代碼
  1. <!-- 網(wǎng)絡(luò)鏈接 -->   
  2.    <uses-permission android:name="android.permission.INTERNET"/>   
  3.    <!-- 地圖 -->   
  4.    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>   
  5.    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>   
  6.    <!-- 讀寫權(quán)限 -->   
  7.    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />   
  8.    <uses-permission android:name="android.permission.WRITE" />  

 這個(gè)應(yīng)用需要網(wǎng)絡(luò)連接的權(quán)限,因?yàn)镚oogle map是實(shí)時(shí)更新的么。然后是GPS傳感器關(guān)于地理位置的權(quán)限。最后需要存儲(chǔ)用戶的記錄點(diǎn),所以有文件讀寫的權(quán)限。

 

為了記錄用戶記錄的情景地點(diǎn),我使用了XML作為存儲(chǔ)的標(biāo)準(zhǔn),并將文件存在了SD卡上

XML解析

網(wǎng)絡(luò)上有很詳細(xì)的各種解析方式,我采用了其中的一種。如果想了解其他的請(qǐng)Google。。。。。

記錄地點(diǎn)信息,我定義了一個(gè)POJO類

Java代碼 復(fù)制代碼
  1. public class RecordLocation {   
  2.     private String location_Id;   
  3.     private String location_ring;   
  4.     private double location_latitude;   
  5.     private double location_longitude;   
  6.     private GeoPoint    point;   
  7. ...篇幅關(guān)系,其他的略  

 XML的解析器,和網(wǎng)絡(luò)上的其他文章一樣就不多說了。能拿來用就成。

Java代碼 復(fù)制代碼
  1. public List<RecordLocation> parse(String xml) {   
  2.         final RecordLocation currentMessage = new RecordLocation();   
  3.         RootElement root = new RootElement("Locations");   
  4.         final List<RecordLocation> messages = new ArrayList<RecordLocation>();   
  5.        // Element channel = root.getChild("RespInfo");   
  6.         Element item = root.getChild("Location");   
  7.         item.setEndElementListener(new EndElementListener(){   
  8.             public void end() {   
  9.                 messages.add(currentMessage.copy());   
  10.             }   
  11.         });   
  12.         item.getChild("id").setEndTextElementListener(new EndTextElementListener(){   
  13.             public void end(String body) {   
  14.                 currentMessage.setLocation_Id(body);   
  15.             }   
  16.         });   
  17.         item.getChild("ring").setEndTextElementListener(new EndTextElementListener(){   
  18.             public void end(String body) {   
  19.                 currentMessage.setLocation_ring(body);   
  20.             }   
  21.         });   
  22.         item.getChild("latitude").setEndTextElementListener(new  
  23.           EndTextElementListener(){   
  24.             public void end(String body) {   
  25.                 currentMessage.setLocation_latitude(Double.valueOf(body));   
  26.             }   
  27.         });   
  28.         item.getChild("longitude").setEndTextElementListener(new EndTextElementListener(){   
  29.             public void end(String body) {   
  30.                 currentMessage.setLocation_longitude(Double.valueOf(body));   
  31.             }   
  32.         });   
  33.   
  34.         try {   
  35.             InputStream   inputStream   =   new   ByteArrayInputStream(xml.getBytes());   
  36.             Xml.parse(inputStream, Xml.Encoding.UTF_8,   
  37.             root.getContentHandler());   
  38.         } catch (Exception e) {   
  39.             throw new RuntimeException(e);   
  40.         }   
  41.         return messages;   
]]>
Android輸入法開發(fā)實(shí)例解析http://www.martymets.com/bbs/dispbbs.asp?BoardID=45&ID=2025&Page=1wangxinxin2010-12-3 11:16:442.五筆輸入法
  這里我們建立表名為CN,這里常規(guī)的字、詞組、五筆都可以使用同一張表,這樣對(duì)應(yīng)查找更方便些,平時(shí)使用王碼的打字員輸入“ep”可以匹配出“愛”字,輸入“jqb”匹配出“昂”字。這里ep就是input字段,而昂就是value字段在表CN中,依次類推。
  3.英文輸入法
這個(gè)就更簡(jiǎn)單了,把常用的單詞表全部放入到數(shù)據(jù)庫中,輸入a自動(dòng)匹配apple、arm這樣的單詞,類似autocomplete是把,其實(shí)就是包含關(guān)系的,這里找個(gè)詞典直接導(dǎo)入即可。
4.聯(lián)想輸入法
  平時(shí)一個(gè)字一個(gè)字的輸入老慢,同樣我們不用很負(fù)責(zé)的算法,直接加入類似“zhongguo”對(duì)應(yīng)“中國”這樣的詞組就OK了,經(jīng)過Android123的初步測(cè)試SQLite數(shù)據(jù)庫在Android上還是蠻快的,但是還是不推薦這樣制作輸入法,至少商用產(chǎn)品不能這樣開發(fā)的。
5. 9宮格輸入法
平時(shí)不用G1附帶的QWERTY鍵盤打字時(shí)可以嘗試下新的9宮格輸入法,比如在傳統(tǒng)手機(jī)鍵盤上,我們可以發(fā)現(xiàn)1鍵對(duì)應(yīng)的是符號(hào),2鍵上刻有 a b c這三個(gè)字母,而9鍵上刻有 w x y z 這個(gè)四個(gè)字母,正常不用遍歷算法一樣可以直接記錄下按鍵順序,比如輸入“ding”這個(gè)拼音就是3464,而輸入“chen”就是2436,最后再使用方法4中的直接查翻譯過來就是中文字了,呵呵是不是很簡(jiǎn)單呢?
三、選字設(shè)計(jì)
  這里我們充分發(fā)揮Android平臺(tái)的觸摸優(yōu)勢(shì),通過Gallery控件可以直接實(shí)現(xiàn)觸摸滾動(dòng),每個(gè)字我們可以當(dāng)作一個(gè)TextView對(duì)待,因?yàn)槎际桥缮赩iew類我們直接使用listener來攔截按下事件,就達(dá)到了觸摸選字,如果是QWERTY布局的話按鍵排列比較緊密,可以使用Android平臺(tái)提供的View類的長(zhǎng)按listener來獲取長(zhǎng)按事件,顯示一個(gè)放大的按下按鈕信息,這點(diǎn)可以參考iPhone手機(jī)的輸入法。
]]>
JNI技術(shù)與Android應(yīng)用http://www.martymets.com/bbs/dispbbs.asp?BoardID=45&ID=2024&Page=1wangxinxin2010-12-3 11:15:40    JNI是Java Native Interface的縮寫。從Java 1.1開始,JNI標(biāo)準(zhǔn)成為java平臺(tái)的一部分,它允許Java和其他語言進(jìn)行交互。JNI一開始為C和C++而設(shè)計(jì)的,但是它并不妨礙你使用其他語 言,只要調(diào)用約定受支持就可以了。使用java與本地已編譯的代碼交互,通常會(huì)喪失平臺(tái)可移植性。但是,有些情況下這樣做是可以接受的,甚至是必須的,比 如,使用一些舊的庫,與硬件、操作系統(tǒng)進(jìn)行交互,或者為了提高程序的性能。關(guān)于 JNI 的用法很簡(jiǎn)單,有點(diǎn)像 java 里的 reflect 的工作機(jī)制,有興趣的朋友可以參看Java 本地接口規(guī)范 http://linux.computersci.net/art ... pec/jniTOC.doc.html
2.  Jni程序開發(fā)的一般操作步驟如下:
(1) 編寫帶有native聲明的方法的java類
(2) 使用javac 或 IDE(JBuilder,eclipse等)編譯所編寫的java類
(3) 使用javah -jni java類名生成擴(kuò)展名為h的頭文件
(4) 使用C++ 實(shí)現(xiàn)本地方法,對(duì)調(diào)用簽名可用 javap –s –p [類全名] 查看(開發(fā) C++ 動(dòng)態(tài)鏈接庫本例是用的 VC6)
注意要從 JDK下面的 include 文件夾中把 jni.h和 jni_md.h 兩個(gè)文件 copy 到你的 VC 工程里
(5) 在 Java 中 load 動(dòng)態(tài)鏈接庫文件,調(diào)用 native 方法.
或者說將項(xiàng)目依賴的所有原生庫和資源加入到j(luò)ava項(xiàng)目的java.library.path,生成java程序
3. 開發(fā)實(shí)例
(1). 編寫 Java 類:
package org.jm.jni;
import java.util.ArrayList;
public class BackgroundProcess {
static {
System.loadLibrary("org_jm_jni_BackgroundProcess");
}
// 三個(gè) native 方法和一個(gè) int 變量
public native boolean checkValid();
public native void processData(BackgroundProcess bg);
public native void processGarbage(String[] bg);
public int num = 5;
// C++ 中可以調(diào)用的方法
public String backProcess(ArrayList<String> p) {
System.out.println("這是 Java 里的方法,在 C++ 中調(diào)用。");
System.out.println("這個(gè)方法,是 java 中 native checkValid 方法調(diào)用的。");
return "look up process ->" + p;
}
public static void main(String[] args) {
String[] array = new String[4];
array[0] = "jack";
array[1] = "maggie";
array[2] = "rocket";
array[3] = "tom";
BackgroundProcess bgP = new BackgroundProcess();
// 調(diào)用 C++ DLL 中定義的方法。
bgP.checkValid();// 該方法回調(diào) java 中的 backProcess 方法,即java::checkValid->c++::checkValid->java::backProcess
bgP.processData(bgP);
bgP.processGarbage(array);
// C++ DLL 改變了該變量
System.out.println("number 現(xiàn)在的值是: " + bgP.num);
}
}
2. 生成 C++ 的頭文件(javah 命令生成,用javap –s –p [類全名] 命令查看java 方法簽名)
/* DO NOT EDIT THIS FILE - it is machine generated */
#include "jni.h"
/* Header for class org_jm_jni_BackgroundProcess */
#ifndef _Included_org_jm_jni_BackgroundProcess
#define _Included_org_jm_jni_BackgroundProcess
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: org_jm_jni_BackgroundProcess
* Method: checkValid
* Signature: ()Z
*/
JNIEXPORT jboolean JNICALL Java_org_jm_jni_BackgroundProcess_checkValid
(JNIEnv *, jobject);
/*
* Class: org_jm_jni_BackgroundProcess
* Method: processData
* Signature: (Lorg/jm/jni/BackgroundProcess;)V
*/
JNIEXPORT void JNICALL Java_org_jm_jni_BackgroundProcess_processData
(JNIEnv *, jobject, jobject);
/*
* Class: org_jm_jni_BackgroundProcess
* Method: processGarbage
* Signature: ([Ljava/lang/String;)V
*/
JNIEXPORT void JNICALL Java_org_jm_jni_BackgroundProcess_processGarbage
(JNIEnv *, jobject, jobjectArray);
#ifdef __cplusplus
}
#endif
#endif
    這里JNIEXPORT和JNICALL都是JNI的關(guān)鍵字,表示此函數(shù)是要被JNI調(diào)用的。例如jint是以JNI為中介使JAVA的int類型與本地 的int溝通的一種類型,我們可以視而不見,就當(dāng)做int使用。函數(shù)的名稱是JAVA_再加上java程序的package路徑再加函數(shù)名組成的。參數(shù) 中,我們也只需要關(guān)心在JAVA程序中存在的參數(shù),至于JNIEnv*和jclass我們一般沒有必要去碰它。
3. 開發(fā) C++ DLL 的原文件 (記得要加入 jni.h 和 jni_md.h 兩個(gè)文件)
發(fā)布 DLL 文件, 我是配置了 path 環(huán)境變量
#include "org_jm_jni_BackgroundProcess.h"
#include <iostream.h>
#include <windows.h>
#include "string.h"
char* jstringTostring(JNIEnv* env, jstring jstr)
{
char* rtn = NULL;
jclass clsstring = env->FindClass("java/lang/String");
jstring strencode = env->NewStringUTF("utf-8");
jmethodID mid = env->GetMethodID(clsstring, "getBytes", "(Ljava/lang/String;)[B");
jbyteArray barr= (jbyteArray)env->CallObjectMethod(jstr, mid, strencode);
jsize alen = env->GetArrayLength(barr);
jbyte* ba = env->GetByteArrayElements(barr, JNI_FALSE);
if (alen > 0)
{
rtn = (char*)malloc(alen + 1);
memcpy(rtn, ba, alen);
rtn[alen] = 0;
}
env->ReleaseByteArrayElements(barr, ba, 0);
return rtn;
}
//char* to jstring
jstring stoJstring(JNIEnv* env, const char* pat)
{
jclass strClass = env->FindClass("Ljava/lang/String;");
jmethodID ctorID = env->GetMethodID(strClass, "<init>", "([BLjava/lang/String;)V");
jbyteArray bytes = env->NewByteArray(strlen(pat));
env->SetByteArrayRegion(bytes, 0, strlen(pat), (jbyte*)pat);
jstring encoding = env->NewStringUTF("utf-8");
return (jstring)env->NewObject(strClass, ctorID, bytes, encoding);
}
/*
* Class: org_jm_jni_BackgroundProcess
* Method: checkValid
* Signature: ()Z
*/
JNIEXPORT jboolean JNICALL Java_org_jm_jni_BackgroundProcess_checkValid
(JNIEnv *env, jobject obj){
jclass bgpClass=env->GetObjectClass(obj);
jmethodID methodId=env->GetMethodID(bgpClass,"backProcess","(Ljava/util/ArrayList;)Ljava/lang/String;");
jobject str=env->CallObjectMethod(obj,methodId,NULL);
jfieldID fieldId=env->GetFieldID(bgpClass,"num","I");
jint number=env->GetIntField(obj,fieldId);
cout << "number 值是: " <<number << endl;
env->SetIntField(obj,fieldId,100L);
return 1;
}
/*
* Class: org_jm_jni_BackgroundProcess
* Method: processData
* Signature: (Lorg/jm/jni/BackgroundProcess;)V
*/
JNIEXPORT void JNICALL Java_org_jm_jni_BackgroundProcess_processData
(JNIEnv *env, jobject, jobject){
cout<< "this function do nothing " << endl;
}
/*
* Class: org_jm_jni_BackgroundProcess
* Method: processGarbage
* Signature: ([Ljava/lang/String;)V
*/
JNIEXPORT void JNICALL Java_org_jm_jni_BackgroundProcess_processGarbage
(JNIEnv *env, jobject, jobjectArray array){
jint size=env->GetArrayLength(array);
cout << "數(shù)組大小是: " << size << endl;
jstring tempObj=NULL;
char *pszSTR1 = NULL;
for(int i=0;i<size;i++){
cout << "current value is : " << i << endl;
tempObj=(jstring)env->GetObjectArrayElement(array,i);
const char * chars =env->GetStringUTFChars(tempObj, 0);
cout << chars << endl;
}
}
在此,針對(duì)andorid中c++與java中的方法互調(diào),引用參考說明如下:
(1).andorid CPP調(diào)用java函數(shù)和訪問其成員:原理 => CPP代碼找到j(luò)ava的那個(gè)class里面的函數(shù)的入口地址,然后在CPP代碼中調(diào)用java代碼
步驟1) 用FindClass()函數(shù)找到該java類(如android.os.Binder)的實(shí)例對(duì)象的引用:
  jclass clazz = env->FindClass(kBinderPathName) = env->FindClass("android.os.Binder")
步驟2) 用GetFieldID()函數(shù)獲取到要訪問的域(field: 實(shí)際上就是該java class中的某個(gè)成員變量的名字)的ID:
  gBinderOffsets.mObject = env->GetFieldID(clazz, "mObject", "I") // mObject為java class "Binder"里的一個(gè)成員變量
  -> 注意,這里將要訪問的那個(gè)java對(duì)象的成員mObject的ID保存到了全局變量gBinderOffsets.mObject中,這樣做的前提和優(yōu)點(diǎn)如下:
  前提: android里面,每個(gè)java進(jìn)程中只允許有一個(gè)java虛擬機(jī)(sun公司原始的java架構(gòu)中,一個(gè)進(jìn)程中可以有多個(gè)java虛擬機(jī))
  優(yōu)點(diǎn): 除了第一次,以后每次要訪問該java對(duì)象的成員mObject就非常快了(不用再去FindClass()和GetFieldID())
步驟3) 用GetMethodID()函數(shù)獲取到要訪問的方法(Method: 實(shí)際上就是該java class中的某個(gè)成員函數(shù)的名字)的ID:
  gBinderOffsets.mExecTransact = env->GetMethodID(clazz, "execTransact", "(IIII)Z") // execTransact為java class "Binder"里的一個(gè)成員函數(shù)
步驟4) 用類似于GetIntField()的函數(shù)獲取到該java對(duì)象的那個(gè)域(即成員)的值:
  IBinder* target = (IBinder*)env->GetIntField(obj,gBinderProxyOffsets.mObject)
     // 獲取java android.os.Binder類型對(duì)象里面的成員mObject的值
步驟5) 用類似于CallBooleanMethod()的函數(shù)調(diào)用到該java對(duì)象的那個(gè)成員函數(shù):
  jboolean res = env->CallBooleanMethod(mObject, gBinderOffsets.mExecTransact, code, (int32_t)&data, (int32_t)reply, flags)
(2).android java調(diào)用CPP函數(shù): 原理 => 相當(dāng)于java的那個(gè)class里面有的函數(shù)使用CPP代碼來實(shí)現(xiàn)了
1)通過結(jié)構(gòu)JNINativeMethod描述java代碼調(diào)用函數(shù)和CPP函數(shù)的對(duì)應(yīng)關(guān)系:
  typedef struct {
  const char* name; // java代碼調(diào)用CPP函數(shù)的入口
  const char* signature; // CPP函數(shù)的返回值
  void* fnPtr; // CPP的函數(shù)名
  } JNINativeMethod;
  => 例如: java代碼通過IBinder.transact()來調(diào)用CPP的函數(shù)android_os_BinderProxy_transact()
  {"transact", "(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z", (void*)android_os_BinderProxy_transact},
2)將CPP函數(shù)注冊(cè)到j(luò)ava的某個(gè)class中: 使用函數(shù)AndroidRuntime::registerNativeMethods()來注冊(cè)
  => 這之后,java代碼就可以調(diào)用CPP函數(shù)了
3)java代碼調(diào)用CPP函數(shù)方法:
  IBinder.transact()
總結(jié)其原理:C/C++要調(diào)用JAVA程序,必須先加載JAVA虛擬機(jī),由JAVA虛擬機(jī)解釋執(zhí)行class文件。為了初始化JAVA虛擬機(jī),JNI提供了一系列的接口函數(shù),通過這些函數(shù)方便地加載虛擬機(jī)到內(nèi)存中。
1). 加載虛擬機(jī):
函數(shù):jint JNI_CreateJavaVM(JavaVM **pvm, void **penv, void args);
參數(shù)說明:JavaVM **pvm JAVA虛擬機(jī)指針,第二個(gè)參數(shù)JNIEnv *env是貫穿整個(gè)調(diào)用過程的一個(gè)參數(shù),因?yàn)楹竺娴乃泻瘮?shù)都需要這個(gè)參數(shù),需注意的是第三個(gè)參數(shù),在jdk1.1與1.2版本有些不同,在JDK 1.1中第三個(gè)參數(shù)總是指向一個(gè)結(jié)構(gòu)JDK1_ 1InitArgs,這個(gè)結(jié)構(gòu)無法完全在所有版本的虛擬機(jī)中進(jìn)行無縫移植。所以為了保證可移植性,建議使用jdk1.2的方法加載虛擬機(jī)。
2). 獲取指定對(duì)象的類定義:
有兩種方法可獲得類定義,一是在已知類名的情況使用FindClass來獲取;二是通過對(duì)象直接得到類定義GetObjectClass
3). 獲取要調(diào)用的方法:
獲得非靜態(tài)方法:
jmethodID (JNICALL *GetMethodID)(JNIEnv *env, jclass clazz, const char *name, const char *sig);
獲得靜態(tài)方法:
jmethodID (JNICALL *GetStaticMethodID)(JNIEnv *env, jclass class, const char *name, const char *sig);
參數(shù)說明:JNIEnv *env初始化是得到的JNI環(huán)境;jclass class前面已獲取到的類定義;const char *name方法名;const char *sig方法參數(shù)定義
4). 調(diào)用JAVA類方法:
函數(shù):CallObjectMethod(JNIEnv *env, jobject obj, jmethodID mid);
函數(shù):CallStaticObjectMethod((JNIEnv *env, jobject obj, jmethodID mid);
5). 獲得類屬性的定義:
jfieldID (JNICALL *GetFieldID) (JNIEnv *env, jclass clazz, const char *name, const char *sig);
靜態(tài)屬性:
jfieldID (JNICALL *GetStaticFieldID) (JNIEnv *env, jclass clazz, const char *name, const char *sig);
6). 數(shù)組處理:
要?jiǎng)?chuàng)建數(shù)組首先要知道類型及長(zhǎng)度,JNI提供了一系列的數(shù)組類型及操作的函數(shù)如:
NewIntArray、NewLongArray、NewShortArray、NewFloatArray、NewDoubleArray、 NewBooleanArray、NewStringUTF、NewCharArray、NewByteArray、NewString,訪問通過 GetBooleanArrayElements、GetIntArrayElements等函數(shù)。
7). 異常:
由于調(diào)用了Java的方法,會(huì)產(chǎn)生異常。這些異常在C/C++中無法通過本身的異常處理機(jī)制來捕捉到,但可以通過JNI一些函數(shù)來獲取Java中拋出的異常信息。
8).多線程調(diào)用
我們知道JAVA是非常消耗內(nèi)存的,我們希望在多線程中能共享一個(gè)JVM虛擬機(jī),真正消耗大量系統(tǒng)資源的是JAVA虛擬機(jī)jvm而不是虛擬機(jī)環(huán)境 env,jvm是允許多個(gè)線程訪問的,但是虛擬機(jī)環(huán)境只能被創(chuàng)建它本身的線程所訪問,而且每個(gè)線程必須創(chuàng)建自己的虛擬機(jī)環(huán)境env。JNI提供了兩個(gè)函 數(shù):AttachCurrentThread和DetachCurrentThread。便于子線程創(chuàng)建自己的虛擬機(jī)環(huán)境。
4.  java與dll交互的技術(shù)
    目前java與dll交互的技術(shù)主要有3種:jni,jawin和jacob。Jni(Java Native Interface)是sun提供的java與系統(tǒng)中的原生方法交互的技術(shù)(在windows\linux系統(tǒng)中,實(shí)現(xiàn)java與native method互調(diào))。目前只能由c/c++實(shí)現(xiàn)。后兩個(gè)都是sourceforge上的開源項(xiàng)目,同時(shí)也都是基于jni技術(shù)的windows系統(tǒng)上的一個(gè) 應(yīng)用庫。Jacob(Java-Com Bridge)提供了java程序調(diào)用microsoft的com對(duì)象中的方法的能力。而除了com對(duì)象外,jawin(Java/Win32 integration project)還可以win32-dll動(dòng)態(tài)鏈接庫中的方法。就功能而言:jni >> jawin>jacob,其大致的結(jié)構(gòu)如下圖:
圖片點(diǎn)擊可在新窗口打開查看
就易用性而言,正好相反:jacob>jawin>>jni。
    Jvm封裝了各種操作系統(tǒng)實(shí)際的差異性的同時(shí),提供了jni技術(shù),使得開發(fā)者可以通過java程序(代碼)調(diào)用到操作系統(tǒng)相關(guān)的技術(shù)實(shí)現(xiàn)的庫函數(shù),從而與 其他技術(shù)和系統(tǒng)交互,使用其他技術(shù)實(shí)現(xiàn)的系統(tǒng)的功能;同時(shí)其他技術(shù)和系統(tǒng)也可以通過jni提供的相應(yīng)原生接口開調(diào)用java應(yīng)用系統(tǒng)內(nèi)部實(shí)現(xiàn)的功能。在 windows系統(tǒng)上,一般可執(zhí)行的應(yīng)用程序都是基于native的PE結(jié)構(gòu),windows上的jvm也是基于native結(jié)構(gòu)實(shí)現(xiàn)的。Java應(yīng)用體 系都是構(gòu)建于jvm之上。
圖片點(diǎn)擊可在新窗口打開查看
    Jni對(duì)于應(yīng)用本身來說,可以看做一個(gè)代理模式。對(duì)于開發(fā)者來說,需要使用c/c++來實(shí)現(xiàn)一個(gè)代理程序(jni程序)來實(shí)際操作目標(biāo)原生函數(shù),java程序中則是jvm通過加載并調(diào)用此jni程序來間接地調(diào)用目標(biāo)原生函數(shù)。
圖片點(diǎn)擊可在新窗口打開查看
5. Android中jni的現(xiàn)有應(yīng)用
(1).從如何載入.so檔案談起
由于Android的應(yīng)用層的類都是以Java寫的,這些Java類編譯為Dex型式的Bytecode之后,必須靠Dalvik虛擬機(jī)(VM: Virtual Machine)來執(zhí)行。VM在Android平臺(tái)里,扮演很重要的角色。此外,在執(zhí)行Java類的過程中,如果Java類需要與C組件溝通時(shí),VM就會(huì) 去載入C組件,然后讓Java的函數(shù)順利地調(diào)用到C組件的函數(shù)。此時(shí),VM扮演著橋梁的角色,讓Java與C組件能通過標(biāo)準(zhǔn)的JNI介面而相互溝通。應(yīng)用 層的Java類是在虛擬機(jī)(VM: Vitual Machine)上執(zhí)行的,而C件不是在VM上執(zhí)行,那么Java程式又如何要求VM去載入(Load)所指定的C組件呢? 可使用下述指令:
System.loadLibrary(*.so的檔案名);
例如,Android框架里所提供的MediaPlayer.java類,含指令:
public class MediaPlayer{
static {
System.loadLibrary("media_jni");
}
}
  這要求VM去載入Android的/system/lib/libmedia_jni.so檔案。載入*.so之后,Java類與*.so檔案就匯合起來,一起執(zhí)行了。
]]>
主站蜘蛛池模板: 儋州市| 会理县| 宝应县| 海晏县| 廊坊市| 离岛区| 丰原市| 赤壁市| 白银市| 高阳县| 法库县| 富民县| 凤翔县| 沾化县| 公安县| 科技| 佛山市| 七台河市| 岑巩县| 满洲里市| 宁国市| 始兴县| 九江市| 云安县| 绥江县| 韩城市| 安乡县| 和龙市| 江山市| 肥乡县| 渭源县| 湖州市| 荥经县| 武夷山市| 勃利县| 玉林市| 罗定市| 偃师市| 苗栗县| 唐海县| 湖口县|