ï»??xml version="1.0" encoding="utf-8" standalone="yes"?>欧美在线观看网站,成人久久精品视频,欧美精品一区二区久久婷婷 http://www.aygfsteel.com/caizh2009/category/45317.html与大家共同成é•?/description>zh-cnFri, 17 Dec 2010 22:27:11 GMTFri, 17 Dec 2010 22:27:11 GMT60Android获取Contact Number的例子(2.0¾pȝ»Ÿä»¥å‰çš„获取方式)http://www.aygfsteel.com/caizh2009/archive/2010/12/17/341010.htmlž®èœæ¯›æ¯›ž®èœæ¯›æ¯›Fri, 17 Dec 2010 09:45:00 GMThttp://www.aygfsteel.com/caizh2009/archive/2010/12/17/341010.htmlhttp://www.aygfsteel.com/caizh2009/comments/341010.htmlhttp://www.aygfsteel.com/caizh2009/archive/2010/12/17/341010.html#Feedback0http://www.aygfsteel.com/caizh2009/comments/commentRss/341010.htmlhttp://www.aygfsteel.com/caizh2009/services/trackbacks/341010.html
  • String[] projection = new String[] {  
  • People._ID,  
  • People.NAME,  
  • People.NUMBER,  
  • };  
  •   
  • // Get the base URI for People table in Contacts content provider.  
  • // which is: content://contacts/people/  
  • Uri contactUri = People.CONTENT_URI;  
  •   
  • // Best way to retrieve a query; returns a managed query.  
  • Cursor peopleCursor = managedQuery (contactUri,  
  • projection, //Which columns to return.  
  • null, // WHERE clause--we won't specify.  
  • null, // Selection Args??  
  • People.DEFAULT_SORT_ORDER); // Order-by name  
  •   
  • // go to the beginning of the list  
  • peopleCursor.moveToFirst();  
  •   
  •   
  • // So, here we have a contact. We need to get the contact ID (_id) then  
  • // build the Uri to get the phones section of that user's record  
  • // which is a subdirectory of a contact record  
  •   
  • long personId = peopleCursor.getLong(peopleCursor.getColumnIndex("_id"));  
  •   
  • Uri personUri = ContentUris.withAppendedId(contactUri, personId );  
  •   
  • // So now the URL looks like: content://contacts/people/_id(where the actual id of the record is here)  
  • Uri phoneUri=  
  • Uri.withAppendedPath(personUri, Contacts.People.Phones.CONTENT_DIRECTORY);  
  •   
  • // Now the URL looks like: content://contacts/people/_id/phones (where phones is literally "phones")  
  •   
  • // Now get all the phone numbers for this contact  
  • Cursor phonesCursor = managedQuery(phoneUri,  
  • null,  
  • null,  
  • null,  
  • Phones.DEFAULT_SORT_ORDER);  
  •   
  • // We now have a cursor for all the phone numbers for that User ID  
  • // go to the beginning of the phone list.  
  • phonesCursor.moveToFirst();   


  • ]]>
    android 2.2 获取联系人,ç”?sh¨´)话åQŒåƈ拨号http://www.aygfsteel.com/caizh2009/archive/2010/12/17/341002.htmlž®èœæ¯›æ¯›ž®èœæ¯›æ¯›Fri, 17 Dec 2010 08:58:00 GMThttp://www.aygfsteel.com/caizh2009/archive/2010/12/17/341002.htmlhttp://www.aygfsteel.com/caizh2009/comments/341002.htmlhttp://www.aygfsteel.com/caizh2009/archive/2010/12/17/341002.html#Feedback0http://www.aygfsteel.com/caizh2009/comments/commentRss/341002.htmlhttp://www.aygfsteel.com/caizh2009/services/trackbacks/341002.html原创  android 2.2 获取联系人,ç”?sh¨´)话åQŒåƈ拨号 æ”¶è—

    该demo是第一‹Æ¡åŸºäºŽandroid开发ã€?/p>

    主要功能有:(x¨¬) è¯Õd–联系人姓名、号码,òq¶lisetview 昄¡¤ºåQŒèŽ·å–listview数据åQŒåƈ发短信、或者拨å?/p>

    package com.android.hello;

    import android.app.Activity;
    import android.content.Intent;   
    import android.database.Cursor;
    import android.graphics.Color;   
    import android.net.Uri;   
    import android.os.Bundle; 
    import android.telephony.PhoneNumberUtils; 
    import android.util.Log;   
    import android.view.View;   
    import android.widget.AdapterView;   
    import android.widget.LinearLayout;   
    import android.widget.ListAdapter;   
    import android.widget.ListView;
    import android.widget.RelativeLayout;
    import android.widget.TextView;
    import android.widget.Toast; 
    import android.provider.ContactsContract;

    import java.util.ArrayList;   
    import java.util.HashMap;
    import android.widget.SimpleAdapter;

    @SuppressWarnings("deprecation")
    public class hello extends Activity {
        /** Called when the activity is first created. */
       // @SuppressWarnings("deprecation")
    // @Override
     //  
     private static final String TAG="App";   
        ListView listView;   
        ListAdapter adapter;   
        /** Called when the activity is first created. */  
        @Override  
        public void onCreate(Bundle savedInstanceState) {   
            super.onCreate(savedInstanceState);   
           // setContentView(R.layout.main);   
            LinearLayout linearLayout=new LinearLayout(this);   
            linearLayout.setOrientation(LinearLayout.VERTICAL);   
            linearLayout.setBackgroundColor(Color.BLACK);   
            LinearLayout.LayoutParams param=new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT,LinearLayout.LayoutParams.WRAP_CONTENT);   
               
            listView=new ListView(this);   
            listView.setBackgroundColor(Color.BLACK);   
               
            linearLayout.addView(listView,param);   
               
            this.setContentView(linearLayout);   
               
         
          //生成动态数¾l„,加入数据
            ArrayList<HashMap<String, Object>> listItem = new ArrayList<HashMap<String, Object>>();        
            ArrayList<HashMap<String, Object>> listItemRead = new ArrayList<HashMap<String, Object>>();     
            Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI,null, null, null, null);      
            while (cursor.moveToNext())    
            {     
             HashMap<String, Object> map = new HashMap<String, Object>();
             String phoneName = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
             map.put("ItemTitle", phoneName);//ç”?sh¨´)话姓å?br />          String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));   
                String hasPhone = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));   
                
                if (hasPhone.compareTo("1") == 0)    
                {   
                    Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = "+ contactId,null, null);        
                    while (phones.moveToNext())    
                    {      
                     String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));       
                        String phoneTpye = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE));       
                       
                        map.put("ItemText", phoneNumber); // 多个åïL(f¨¥ng) å¦‚何处理
                        
                        Log.d(TAG,"testNum="+ phoneNumber + "type:"+phoneTpye); 
                    }        
                    phones.close();       
                }       
                Cursor emails = getContentResolver().query(ContactsContract.CommonDataKinds.Email.CONTENT_URI,null,ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = " + contactId,null, null);   
                while (emails.moveToNext())    
                {                    
                    String emailAddress = emails.getString(emails.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));   
                    String emailType = emails.getString(emails.getColumnIndex(ContactsContract.CommonDataKinds.Email.TYPE));      

                    Log.d(TAG,"testNum="+ emailAddress + "type:"+emailType); 
                }       
                emails.close();
                
                listItem.add(map); 
            }
            
            //生成适配器的Item和动态数¾l„对应的元素   
            SimpleAdapter listItemAdapter = new SimpleAdapter(this,listItem,//数据æº?nbsp;   
                android.R.layout.simple_list_item_2,//ListItemçš„XML实现   
                //动态数¾l„与ImageItem对应的子™å?nbsp;          
                new String[] {"ItemTitle", "ItemText"},    
                //ImageItemçš„XMLæ–‡äšg里面的一个ImageView,两个TextView ID   
                new int[] {android.R.id.text1,android.R.id.text2}   
            );              
            
            listView.setAdapter(listItemAdapter);   
            cursor.close();  
            
            //listView.setEmptyView(findViewById(R.id.empty));   
               
            listView.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener(){   
      
                public void onItemSelected(AdapterView<?> arg0, View arg1,   
                        int arg2, long arg3) {   
                    // TODO Auto-generated method stub   
                    //openToast("滚动刎ͼš(x¨¬)"+arg0.getSelectedItemId());   
                    //短信发é€?nbsp;  
                 setTitle("选择"+arg2+"™å¹ç›®");
                 openToast("选择"+arg0.getSelectedItemId()+"™å¹ç›®");
        RelativeLayout lr = (RelativeLayout) arg1;
        TextView mText = (TextView) lr.getChildAt(1);
        openToast(mText.getText().toString());

        String number = mText.getText().toString();
        Log.d(TAG, "number=" + number);
        // 判断ç”?sh¨´)话åïL(f¨¥ng) çš„æœ‰æ•ˆæ€?br />     if (PhoneNumberUtils.isGlobalPhoneNumber(number)) {
         Intent intent = new Intent(Intent.ACTION_SENDTO, Uri
           .parse("smsto://" + number));
         intent.putExtra("sms_body", "The SMS text");
         startActivity(intent);             
        } 
                }   
      
                public void onNothingSelected(AdapterView<?> arg0) {   
                    // TODO Auto-generated method stub   
                       
                }   
                   
            });  
            
            listView.setOnItemClickListener(new AdapterView.OnItemClickListener(){  

       public void onItemClick(AdapterView<?> arg0, View arg1,
         int position, long arg3) {
        // TODO Auto-generated method stub
        // openToast("Click"+Integer.toString(position+1)+"™å¹ç›®");
        RelativeLayout lr = (RelativeLayout) arg1;
        TextView mText = (TextView) lr.getChildAt(1);
        openToast(mText.getText().toString());

        String number = mText.getText().toString();
        Log.d(TAG, "number=" + number);
        // 判断ç”?sh¨´)话åïL(f¨¥ng) çš„æœ‰æ•ˆæ€?br />     if (PhoneNumberUtils.isGlobalPhoneNumber(number)) {
         Intent intent = new Intent(Intent.ACTION_DIAL, Uri
           .parse("tel://" + number));
         startActivity(intent);
        }
       }
      });
     }
     
        private void openToast(String str){   
            Toast.makeText(this,str,Toast.LENGTH_SHORT).show();   
        }   



    ]]>
    Android中添加Admobòq¿å‘ŠåQˆè{http://www.aygfsteel.com/caizh2009/archive/2010/12/10/340283.htmlž®èœæ¯›æ¯›ž®èœæ¯›æ¯›Fri, 10 Dec 2010 09:42:00 GMThttp://www.aygfsteel.com/caizh2009/archive/2010/12/10/340283.htmlhttp://www.aygfsteel.com/caizh2009/comments/340283.htmlhttp://www.aygfsteel.com/caizh2009/archive/2010/12/10/340283.html#Feedback0http://www.aygfsteel.com/caizh2009/comments/commentRss/340283.htmlhttp://www.aygfsteel.com/caizh2009/services/trackbacks/340283.htmlèŠ×ƒº†æ•´æ•´ä¸€å¤©æ—¶é—ß_(d¨¢)¼Œç ”究怎么通过åœ?font style="background-color: #00ffff;">Android应用½E‹åºä¸­æ·»åŠ Admobòq¿å‘Šæ¥èµšé’±ã€‚网上也有些教程åQŒä¸˜q‡è¯´å¾—不够详¾l†ï¼Œè‡ªå·±˜q˜å¾—èŠ±æ—¶é—´æ‘¸ç´¢ã€‚äØ“(f¨´)了让后来者能更快开始Admobòq¿å‘Šèµšé’±åQŒæ‰€ä»¥å†™ä¸ªè¯¦¾l†ä¸€ç‚¹çš„æ•™ç¨‹åQŒä¾›å¤§å®¶å‚考ã€?/p>

    例子工程源码下蝲地址åQ?廸™®®ä½¿ç”¨‹¹è§ˆå™¨è‡ªå¸¦çš„下蝲工具下蝲)http://cid-cb78b387364ae9a7.skydrive.live.com/browse.aspx/.Public/%e8%bd%af%e4%bb%b6/Andoroid
    当然åQŒæˆ‘也参考了一些网上的资料åQŒä¸»è¦æœ‰åQ?/p>

    AdMobåQšåœ¨android应用中嵌入广告的æ–ÒŽ(gu¨©)¡ˆ
    如何åœ?font style="background-color: #00ffff;">Android Market赚钱 part 2 - 免费app附带òq¿å‘Š
    Publisher Starter Kit
    面向开发�Wiki �AdMob

    好了åQŒçŽ°åœ¨è®©æˆ‘ä»Žå¤´å¼€å§‹è¯´èµ?#8230;…在这之前åQŒä½ ä¸éœ€è¦æœ‰ä»ÖM½•çš„å¸åøP¼Œå”¯ä¸€éœ€è¦çš„ž®±æ˜¯æœ‰ä¸€ä¸ªæœ‰æ•ˆçš„email邮箱。只要按照下面的步骤一步步来,你就能通过ž®†Admob的广告插到自å·Þqš„½E‹åºä¸­èµšé’±å•¦åQ?/p>

    首先åQŒå½“然是需要注册一个Admob的帐受÷€‚Admob的主™å‰|˜¯åQ?a >http://www.admob.com/ ã€?当然åQŒå¦‚果你对于‹¹è§ˆè‹±æ–‡¾|‘页˜q˜æœ‰äº›éšœ¼„çš„话,可以ç™Õd½•中文¾|‘ç«™åQ?a >http://zhcn.admob.com/ 。如果网站的文字˜q˜æ˜¯è‹±æ–‡åQŒä½ å¯ä»¥åœ¨ç½‘站主™å늚„右下角的“Language”处,选择“中文åQˆç®€ä½“)”。点击进入注册页面后åQŒæœ‰ä¸€äº›æ ç›®éœ€è¦å¡«å†™ï¼Œä¸è¦å¤? ˜q‡ç–‘虑,ž®±åƒä½ æ³¨å†Œä¸€ä¸ªè®ºå›ä¸€æ øP¼Œéšä¾¿å¡«ä¸‹ž®±å¥½äº†ã€‚最关键的是保证填写的email地址有效åQŒå¦å¤–就是填上姓名,选择语言。帐æˆïL(f¨¥ng)±»åž‹æˆ‘选择çš?#8220;不确å®?#8221;åQ? 语言“中文åQˆç®€ä½“)”ï½?提交注册甌™¯·ä¹‹åŽåQŒä¸ä¹…ä½ ž®×ƒ¼š(x¨¬)收到用于¼‹®è®¤òq¶æ¿€‹zÕd¸åïL(f¨¥ng)š„ç”?sh¨´)子邮äšgåQŒç‚¹å‡?y¨¢n)L¿€‹z»é“¾æŽ¥ï¼Œž®±å¯ä»¥äº†‹È€‹zÖM½ çš„Admob帐号了~

    ½W¬äºŒæ­¥å°±æ˜¯è®¾¾|®ä½ çš?font style="background-color: #00ffff;">Androidåº? 用程序信息,òq¶èŽ·å¾—Admob的插入代码。登录你的Admob帐号后,在主™å늚„左上方(Logo上面åQ‰ç‚¹å‡?#8220;MarketplaceåQˆæ‰‹æœºå¹¿å‘Šå¸‚场)”åQ? ˜q›å…¥™åµé¢åŽï¼Œåœ?#8220;Sites&AppsåQˆç«™ç‚¹å’Œåº”用½E‹åºåQ?#8221;标签下,点击“Add Site/App”。选择我们熟æ?zh¨¨n)‰çš„图标—â€? Android App ” 。这时会(x¨¬)出现需要你填写一ä¸?#8220;详细信息”åQŒéšä¾¿å¡«ä¸Šä¸€äº›ä¿¡æ¯ã€‚ï¼ˆä¸è¦å¤ªè¿‡åœ¨æ„çŽ°åœ¨å¡«å†™çš„ä¸œè¥¿ï¼Œå› äØ“(f¨´)˜q™äº›ä»¥åŽéƒ½æ˜¯å¯ä»¥ä¿®æ”¹çš„)。比å¦?#8220;Android Package URL” 我到现在都还没有填写åQŒæ˜qîC¹‹¾cȝš„åQŒæƒ³å†™å°±å†™ç‚¹å§ã€‚填好详¾l†ä¿¡æ¯åŽåQŒç‚¹å‡?#8220;¾l§ç®‹”åQŒå°±å¯ä»¥åˆ°AdMob Android SDK 的下载页面了。下载这个SDKåQˆå½“ç„Óž¼Œ˜q™ä¸ªå¾ˆé‡è¦ï¼‰ã€?/p>

    The AdMob Android SDK includes:

    README: Get started with AdMob Android ads!
    AdMob Jar file: Required for publishing ads. Follow the documentation in javadoc/index.html and drop the AdMob Jar file into your project.
    Sample Projects: Examples of AdMob Android ads shown in the LunarLander application.

    ½W¬ä¸‰æ­¥èŽ·å–ä½ çš„åº”ç”¨ç¨‹åºå¯¹åº”çš„Publisher ID。在下蝲™åµé¢ç‚¹å‡»"Go to Sites/Apps"ž®±å¯ä»¥åˆ°ä½ åº”用程序的½Ž¡ç†ç•Œé¢äº†ã€‚这时你ä¼?x¨¬)发现在˜q™ä¸ª™åµé¢é†’目的位¾|®ä¼š(x¨¬)有一个叫你填写详¾l†ä¿¡æ¯çš„æç¤ºåQ?/p>

    在我们发送ä“Q何有待收入之前,æ‚(zh¨¨n)¨éœ€è¦å¡«å†™æŠ€æœ¯è”¾p»è¯¦¾l†ä¿¡æ¯å’Œä»˜æ¬¾é¦–选项ã€?/p>

    我们暂时可以不用½Ž¡å®ƒåQŒå› ä¸ºé’±æ˜¯ä¼š(x¨¬)存在我们的Admobçš„è̎户上的,½{‰æˆ‘们需要提现的时候,或者你惛_¡«çš„æ—¶å€™å†å¡«å°±å¯ä»¥äº†ã€‚在下面的列表中åQŒé€‰æ‹©ä½? çš„åº”ç”¨ç¨‹åºåÆˆ˜q›å…¥ã€‚这个界面就是你的应用程序广告的½Ž¡ç†ç•Œé¢äº†ï¼Œé‡Œé¢æœ‰æ¯”较多的功能,以后可以慢慢了解åQŒçŽ°åœ¨æˆ‘ä»¬åªéœ€è¦çŸ¥é“ä¸¤ä¸ªä¸œè¥¿ï¼Œä¸€ä¸ªæ˜¯å‘å¸ƒè€? IDåQˆPublisher IDåQ‰ï¼Œä¸€ä¸ªæ˜¯ä½ ç¨‹åºçš„状态。Publisher ID是一ä¸?5个字½W¦çš„字符ä¸ÔŒ¼Œè€Œä½ ½E‹åºçš„状态现在应该还是不‹zÕdЍåQˆInactiveåQ‰ã€‚我们下面要做的ž®±æ˜¯æ€Žä¹ˆè®©å®ƒå˜äØ“(f¨´)Activeã€?/p>

    ½W¬å››æ­¥ä»£ç ç¼–写——在你的应用½E‹åºä¸­æ’å…¥Admobòq¿å‘Šã€‚经˜q‡ä¸Šé¢çš„æ­¥éª¤åQŒæˆ‘们在¾|‘站上的讄¡½®ž®±å‘Šä¸€ä¸ªæ®µè½äº†åQŒçŽ°åœ¨æˆ‘ä»¬ç»ˆäºŽè¦˜q›å…¥ä¸»é¢˜äº†ï¼Œå¦‚何在自å·Þqš„Android应用½E‹åºä¸­æ’å…¥Admobòq¿å‘Šã€‚如果你不健忘的话,一定还记得我们之前下蝲的那个AdMob Android SDK 。解压它åQŒçœ‹çœ‹é‡Œé¢æœ‰äº›ä»€ä¹ˆä¸œè¥Ñ€‚这里面最重要的就是那个名ä¸?#8220;admob-sdk-android.jar”的包啦,Admobž®†å¦‚何把òq¿å‘ŠåŠ è²åˆ?font style="background-color: #00ffff;">Android应用½E‹åºä¸­çš„代码集成在这个包里,我们¾~–写½E‹åºçš„æ—¶å€™å°±éœ€è¦å°†˜q™ä¸ªåŒ…导入到我们的工½E‹é‡Œé¢åŽ»ã€‚å¦å¤–ï¼Œè§£åŽ‹å‡ºæ¥çš„æ–‡ä»¶å¤¹ä¸­è¿˜æœ‰ä¸€ä¸ªåä¸?#8220;javadoc”的文件夹åQŒæ‰“开它里面的index.html。它是关于Admob Android SDK的帮助文档,在Package 下的Setup下,有详¾l†å®Œæ•´çš„在自å·Þqš„应用½E‹åºä¸­æ’入广告的æ–ÒŽ(gu¨©)³•介绍åQŒåœ¨˜q™é‡Œæˆ‘å°±åäh‡’åQŒå¼•用一下~


    Including the Jar
    Add the Jar file included with the SDK to your Android project as an external library. In your project's root directory create a subdirectory libs (this will already be done for you if you used Android's activitycreator). Copy the AdMob Jar file into that directory. For Eclipse projects:

    Go to the Properties of your project (right-click on your project from the Package Explorer tab and select Properties)
    Select "Java Build Path" from left panel
    Select "Libraries" tab from the main window
    Click on "Add JARs..."
    Select the JAR copied to the libs directory
    Click "OK" to add the SDK to your android project

    注意åQšéœ€è¦é¦–先在你工½E‹çš„æ ¹ç›®å½•下新徏一个叫å?#8220;libs”的文件夹åQŒåƈ把之前所说的最重要的东è¥?#8220;admob-sdk-android.jar”复制到里面ã€?/p>


    AndroidManifest.xml

    Your AdMob publisher ID was given to you when creating your publisher account on www.admob.com before downloading this code. It is a 15-character code like a1496ced2842262. Just before the closing </application> tag add a line to set your publisher ID:


                    <!-- The application's publisher ID assigned by AdMob -->
                    <meta-data android:value="YOUR_ID_HERE" android:name="ADMOB_PUBLISHER_ID" />
            </application>
    Set any permissions not already included just before the closing </manifest> tag:
                    <!-- AdMob SDK permissions -->
                    <uses-permission android:name="android.permission.INTERNET" />
                    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
            </manifest>

    Only the INTERNET permission is required. Setting ACCESS_COARSE_LOCATION (and/or ACCESS_FINE_LOCATION) allows narrowly geo-targeted ads be shown.

    ˜q™é‡Œéœ€è¦æ³¨æ„çš„æ˜¯ï¼Œ<meta-data android:value="YOUR_ID_HERE" android:name="ADMOB_PUBLISHER_ID" />中,我们只需要改的是"YOUR_ID_HERE"。这里需要你填上的IDž®±æ˜¯æˆ‘们之前在Admob¾|‘站我们的应用程序管理页面上看到çš? Publisher IDåQŒè€Œname="ADMOB_PUBLISHER_ID"是不应该改的。程序需要这个Key来查扑֯¹åº”çš„Valueã€?/p>

    attrs.xml
    The attrs.xml file specifies custom AdView attributes in XML layout files. If your application does not already have an /res/values/attrs.xml file then create one and copy-and-paste the following into it. If you do have that file then just add the declare-styleable element:


            <?xml version="1.0" encoding="utf-8"?>
            <resources>
                    <declare-styleable name="com.admob.android.ads.AdView">
                            <attr name="testing" format="boolean" />
                            <attr name="backgroundColor" format="color" />
                            <attr name="textColor" format="color" />
                            <attr name="keywords" format="string" />
                            <attr name="refreshInterval" format="integer" />
                            <attr name="isGoneWithoutAd" format="boolean" />
                    </declare-styleable>
            </resources>

    ˜q™ä¸ªåQŒæ²¡ä»€ä¹ˆè¯´çš„ã€?/p>


    Placing an AdView in a Layout
    AdView widgets can be put into any XML layout now. The first step is to reference attrs.xml in your layout element by adding an xmlns line that includes your package name specified in AndroidManifest.xml:


            xmlns:yourapp=http://schemas.android.com/apk/res/yourpackage

    For example a simple screen with only an ad on it would look like:


            <?xml version="1.0" encoding="utf-8"?>
            <LinearLayout
                    xmlns:android="http://schemas.android.com/apk/res/android"
                    xmlns:admobsdk="http://schemas.android.com/apk/res/com.admob.android.example"
                    android:orientation="vertical"
                    android:layout_width="fill_parent"
                    android:layout_height="fill_parent">
       
                    <com.admob.android.ads.AdView
                            android:id="@+id/ad"
                            android:layout_width="fill_parent"
                            android:layout_height="wrap_content"
                            admobsdk:backgroundColor="#000000"
                            admobsdk:textColor="#FFFFFF"
                            admobsdk:keywords="Android application"
                    />
                           
            </LinearLayout>

    ˜q™é‡Œå¥½åƒä¹Ÿæ²¡ä»€ä¹ˆéœ€è¦ç‰¹åˆ«æ³¨æ„çš„åQŒæ³¨æ„åŠ ä¸ŠxmlnsåQŒå¦å¤–知道这里可以设¾|®ä¸€ä¸ªkeywords

    Test Mode
    When you start integrating AdMob ads into your application it is recommended to use test mode. This always returns the same ad. Normal ad requests are not deterministic making it harder to be sure the ad view looks like you want (e.g. ad requests can timeout or may not fill).

    Once the ad shows up as you expect be sure to turn test mode off to get real ads. Never put your application into the Android Market with test mode enabled.

    Test mode can be enabled either by calling AdManager.setInTestMode(true) or by adding a "admobsdk:testing="true"" property to the ad in your XML layout (where "admobsdk" is the XML namespace for your application).


    讄¡½®Test Mode˜q™ä¸ªå¾ˆå…³é”®ï¼Œåƒä¸‡åˆ«å°†å¤„于Test Mode的程序发布出åŽÖMº†åQŒé‚£æ ·å¯èµšä¸äº†é’±å•Šï½žåQå¦‚果在AdView的属性中不加上admobsdk:testing="false"åQŒä¼¼ä¹Žç¨‹åºä¹Ÿæ˜¯ä¸å¤„于Test Mode的,不过最好还是加上吧ï½?/p>

    ½W¬äº”步编译运行,òq¶æ¿€‹zȝ¨‹åºã€‚编译运行你的程序,在模拟器上就可以看到效果啦~åQˆå½“然你的模拟器需要能上网åQŒå…³äºŽæ€Žä¹ˆè®©æ¨¡æ‹Ÿå™¨ä¸Šç½‘呢?用èµ\ç”Þqš„应该 可以直接上,如果不是用èµ\由,那么可能需要设¾|®ä¸‹åQŒå…·ä½“方法大家自å·Þq½‘上搜吧,具体忘了åQ‰ã€‚如果你的应用程序能昄¡¤ºå‡ºå¹¿å‘Šï¼Œé‚£ä¹ˆæ­å–œä½ ï¼Œä½ çš„应用½E‹åºå¾ˆå¿« ž®×ƒ¼š(x¨¬)在Admob上被‹È€‹zÖMº†åQˆéœ€è¦ä¸€å®šçš„æ—‰™—´åQŒæˆ‘的好像花了一个小时不刎ͼ‰åQ?/p>

    ½W¬å…­æ­¥åœ¨Admob¾|‘站上查看应用程序赚了多ž®‘é’±ï½?#8220;手机òq¿å‘Šå¸‚场”â€?gt;“报告”â€?gt;“站点和应用程序报å‘?#8221;。选择你的应用½E‹åºåQŒç„¶åŽç‚¹å‡»é¡µé¢æœ€ä¸‹é¢çš?#8220;创徏报告”ï½?OKåQŒèµšé’±å•¦ï½?/p>

    最后,我把我自己写的一个例子工½E‹ä¸Šä¼ ä¸Šæ¥ï¼Œå¤§å®¶å¯ä»¥ä¸‹è²æ¥å‚考下。另外,我的工程ž®†å¹¿å‘Šä½œä¸ºç§»åŠ¨çš„åQŒåƈ且改变了它默认的宽度和背景,希望对如何在应用½E‹åºä¸­æ‘†æ”‘Ö¹¿å‘Šï¼Œèµ·åˆ°ä¸€ä¸ªæŠ›ç –引玉的作用。效果图如下åQˆå“ˆå“ˆï¼Œåœ¨æ¨¡æ‹Ÿå™¨è·‘的~)åQ?/p>



    1.http://www.admob.com/æ³¨å†Œä¸€ä¸ªå¸åøP¼Œ

    æ·ÕdŠ Add Mobile Site/appåQŒè¾“入相关信息后åQŒæäº¤å®Œæˆï¼Œ

    下蝲Androidòq›_°ä½¿ç”¨çš„JARåQŒæŸ¥çœ‹å‘布è€?IDã€?/p>

    2.然后ž®†JARæ·ÕdŠ åˆîC½ çš„项目中

    Properties->Java Build Path->Libraries->Add JARs…->Select the JAR->OK

    3.¾~–辑AndroidManifest.xml

    application节点中添�/p>

    <!– The application’s publisher ID assigned by AdMob –>

    <meta-data android:value=”a14ae1ce0357305″ android:name=”ADMOB_PUBLISHER_ID” />

    manifest节点æ·ÕdŠ æƒé™ç”Œ™¯·

    <!– AdMob SDK permissions –>

    <uses-permission android:name=”android.permission.INTERNET” />

    4.æ·ÕdŠ attrs.xml

    /res/values/attrs.xml

    <?xml version=”1.0″ encoding=”utf-8″?>

    <resources>

    <declare-styleable name=”com.admob.android.ads.AdView”>

    <attr name=”testing” format=”boolean” />

    <attr name=”backgroundColor” format=”color” />

    <attr name=”textColor” format=”color” />

    <attr name=”keywords” format=”string” />

    <attr name=”refreshInterval” format=”integer” />

    <attr name=”isGoneWithoutAd” format=”boolean” />

    </declare-styleable>

    </resources>

    5.æ·ÕdŠ òq¿å‘оl„äšg

    <?xml version=”1.0″ encoding=”utf-8″?>

    <LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android”

    xmlns:admobsdk=”http://schemas.android.com/apk/res/com.moandroid.livesports”

    android:orientation=”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”

    />

    <com.admob.android.ads.AdView

    android:id=”@+id/ad”

    android:layout_width=”fill_parent”

    android:layout_height=”wrap_content”

    admobsdk:backgroundColor=”#000000″

    admobsdk:textColor=”#FFFFFF”

    admobsdk:keywords=”Android application”

    admobsdk:refreshInterval=”60″

    />

    </LinearLayout>

    6.昄¡¤ºæ•ˆæžœ

    为免费app嵌入Admobòq¿å‘ŠåQŒè¿›è€ŒèŽ·å¾—å¹¿å‘Šæ”¶å…¥ã€?/p>

    adm



    ]]>
    区分Activity的四¿UåŠ è½½æ¨¡å¼?/title><link>http://www.aygfsteel.com/caizh2009/archive/2010/12/10/340227.html</link><dc:creator>ž®èœæ¯›æ¯›</dc:creator><author>ž®èœæ¯›æ¯›</author><pubDate>Fri, 10 Dec 2010 02:38:00 GMT</pubDate><guid>http://www.aygfsteel.com/caizh2009/archive/2010/12/10/340227.html</guid><wfw:comment>http://www.aygfsteel.com/caizh2009/comments/340227.html</wfw:comment><comments>http://www.aygfsteel.com/caizh2009/archive/2010/12/10/340227.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/caizh2009/comments/commentRss/340227.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/caizh2009/services/trackbacks/340227.html</trackback:ping><description><![CDATA[http://marshal.easymorse.com/archives/2950 <div> <p>在多Activity开发中åQŒæœ‰å¯èƒ½æ˜¯è‡ªå·±åº”用之间的Activityè·Œ™{åQŒæˆ–者夹带其他应用的可复用Activity。可能会(x¨¬)希望跌™{到原来某个Activity实例åQŒè€Œä¸æ˜¯äñ”生大量重复的Activityã€?/p> <p>˜q™éœ€è¦äØ“(f¨´)Activity配置特定的加载模式,而不是ä‹É用默认的加蝲模式ã€?/p> <h4>加蝲模式分类å?qi¨¢ng)在哪里配ç½?/h4> <p>Activity有四¿UåŠ è½½æ¨¡å¼ï¼š(x¨¬)</p> <ul> <li>standard</li> <li>singleTop</li> <li>singleTask</li> <li>singleInstance</li> </ul> <p>讄¡½®çš„位¾|®åœ¨AndroidManifest.xmlæ–‡äšg中activity元素的android:launchMode属性:(x¨¬)</p> <blockquote> <p><activity android:name="ActB" <strong>android:launchMode</strong>="singleTask"></activity></p> </blockquote> <p>也可以在Eclipse ADT中图形界面中¾~–辑åQ?/p> <p><a ><img style="border: 0px none; display: inline;" title="image" alt="image" src="http://marshal.easymorse.com/wp-content/uploads/2010/07/image_thumb54.png" border="0" height="144" width="498" /></a> </p> <p> </p> <p>区分Activity的加载模式,通过½CÞZ¾‹ä¸€ç›®äº†ç„¶ã€‚这里编写了一个Activity AåQˆActAåQ‰å’ŒActivity BåQˆActBåQ‰åó@环蟩转的例子。对加蝲模式修改和代码做½Eå¾®æ”¹åЍåQŒå°±å¯ä»¥è¯´æ˜Žå››ç§æ¨¡å¼çš„区别ã€?/p> <h4>standard</h4> <p>首先说standard模式åQŒä¹Ÿž®±æ˜¯é»˜è®¤æ¨¡å¼åQŒä¸éœ€è¦é…¾|®launchMode。先只写一个名为ActAçš„ActivityåQ?/p> <blockquote> <p>package com.easymorse.activities; </p> <p>import android.app.Activity; <br /> import android.content.Intent; <br /> import android.os.Bundle; <br /> import android.view.View; <br /> import android.view.View.OnClickListener; <br /> import android.widget.Button; <br /> import android.widget.LinearLayout; <br /> import android.widget.TextView; </p> <p>public class ActA extends Activity { <br />     /** Called when the activity is first created. */ <br />     @Override <br />     public void onCreate(Bundle savedInstanceState) { <br />         super.onCreate(savedInstanceState); <br />         TextView textView = new TextView(this); <br />         textView.setText(this + ""); <br />         Button button = new Button(this); <br />         button.setText("go actA"); <br />         button.setOnClickListener(new OnClickListener() { <br />             @Override <br />             public void onClick(View v) { <br />                 Intent intent = new Intent(); <br />                 intent.setClass(ActA.this, ActA.class); <br />                 startActivity(intent); <br />             } <br />         }); <br />         LinearLayout layout = new LinearLayout(this); <br />         layout.setOrientation(LinearLayout.VERTICAL); <br />         layout.addView(textView); <br />         layout.addView(button); <br />         this.setContentView(layout); <br />     } <br /> }</p> </blockquote> <p>例子中都没有用layoutåQŒå…å¾—看着¾|—嗦。可见是ActA –> ActA的例子。在界面中打印出对象的toString值可以根据hash code识别是否创徏新ActA实例ã€?/p> <p>½W¬ä¸€ä¸ªç•Œé¢ï¼š(x¨¬)</p> <p><a ><img style="border: 0px none; display: inline;" title="image" alt="image" src="http://marshal.easymorse.com/wp-content/uploads/2010/07/image_thumb55.png" border="0" height="101" width="244" /></a> </p> <p>点击按钮后:(x¨¬)</p> <p><a ><img style="border: 0px none; display: inline;" title="image" alt="image" src="http://marshal.easymorse.com/wp-content/uploads/2010/07/image_thumb56.png" border="0" height="114" width="244" /></a> </p> <p>可以多点几次。发现每‹Æ¡éƒ½åˆ›å¾äº†è¯¥Activity的新实例。standard的加载模式就是这æ ïL(f¨¥ng)š„åQŒintentž®†å‘送给新的实例ã€?/p> <p>现在点Android讑֤‡çš„回退键,可以看到是按照刚才创建Activity实例的倒序依次出现åQŒç±»ä¼¼é€€æ ˆçš„æ“ä½œåQŒè€Œåˆšæ‰æ“ä½œèŸ©è½¬æŒ‰é’®çš„˜q‡ç¨‹æ˜¯åŽ‹æ ˆçš„æ“ä½œã€‚å¦‚ä¸‹å›¾åQ?/p> <p><a ><img style="border: 0px none; display: inline;" title="image" alt="image" src="http://marshal.easymorse.com/wp-content/uploads/2010/07/image_thumb57.png" border="0" height="233" width="244" /></a> </p> <h4>singleTop</h4> <p>singleTopå’Œstandard模式åQŒéƒ½ä¼?x¨¬)å°†intent发送新的实例(后两¿Uæ¨¡å¼ä¸å‘送到新的实例åQŒå¦‚果已¾læœ‰äº†çš„话)。不 ˜q‡ï¼ŒsingleTop要求如果创徏intent的时候栈™å¶å·²¾læœ‰è¦åˆ›å»ºçš„Activity的实例,则将intent发送给该实例,而不发送给新的实例ã€?/p> <p>˜q˜æ˜¯ç”¨åˆšæ‰çš„½CÞZ¾‹åQŒåªéœ€ž®†launchModeæ”¹äØ“(f¨´)singleTopåQŒå°±èƒ½çœ‹åˆ°åŒºåˆ«ã€?/p> <p>˜qè¡Œçš„æ—¶å€™ä¼š(x¨¬)发现åQŒæŒ‰å¤šå°‘遍按钮,都是相同的ActiA实例åQŒå› ä¸ø™¯¥å®žä¾‹åœ¨æ ˆ™åÓž¼Œå› æ­¤ä¸ä¼š(x¨¬)创徏新的实例。如果回退åQŒå°†é€€å‡ºåº”用ã€?/p> <p><a ><img style="border: 0px none; display: inline;" title="image" alt="image" src="http://marshal.easymorse.com/wp-content/uploads/2010/07/image_thumb58.png" border="0" height="144" width="244" /></a> </p> <p>singleTop模式åQŒå¯ç”¨æ¥è§£å†³æ ˆé¡¶å¤šä¸ªé‡å¤ç›¸åŒçš„Activity的问题ã€?/p> <p>如果是A Activityè·Œ™{到B ActivityåQŒå†è·Œ™{到A ActivityåQŒè¡Œä¸ºå°±å’Œstandard一样了åQŒä¼š(x¨¬)在B Activityè·Œ™{到A Activity的时候创建A Activity的新实例åQŒå› ä¸ºå½“时的栈顶不是A Activity实例ã€?/p> <p>ActA¾cȝ¨ä½œæ”¹åŠ¨ï¼š(x¨¬)</p> <blockquote> <p>package com.easymorse.activities; </p> <p>import android.app.Activity; <br /> import android.content.Intent; <br /> import android.os.Bundle; <br /> import android.view.View; <br /> import android.view.View.OnClickListener; <br /> import android.widget.Button; <br /> import android.widget.LinearLayout; <br /> import android.widget.TextView; </p> <p>public class ActA extends Activity { <br />     /** Called when the activity is first created. */ <br />     @Override <br />     public void onCreate(Bundle savedInstanceState) { <br />         super.onCreate(savedInstanceState); <br />         TextView textView = new TextView(this); <br />         textView.setText(this + ""); <br />         Button button = new Button(this); <br />         button.setText("go actB"); <br />         button.setOnClickListener(new OnClickListener() { <br />             @Override <br />             public void onClick(View v) { <br />                 Intent intent = new Intent(); <br />                 intent.setClass(ActA.this, ActB.class); <br />                 startActivity(intent); <br />             } <br />         }); <br />         LinearLayout layout = new LinearLayout(this); <br />         layout.setOrientation(LinearLayout.VERTICAL); <br />         layout.addView(textView); <br />         layout.addView(button); <br />         this.setContentView(layout); <br />     } <br /> }</p> <p> </p> </blockquote> <p>ActB¾c»ï¼š(x¨¬)</p> <blockquote> <p>package com.easymorse.activities; </p> <p>import android.app.Activity; <br /> import android.content.Intent; <br /> import android.os.Bundle; <br /> import android.view.View; <br /> import android.view.View.OnClickListener; <br /> import android.widget.Button; <br /> import android.widget.LinearLayout; </p> <p>public class ActB extends Activity { <br />     @Override <br />     protected void onCreate(Bundle savedInstanceState) { <br />         super.onCreate(savedInstanceState); <br />          Button button=new Button(this); <br />             button.setText("go actA"); <br />             button.setOnClickListener(new OnClickListener() { <br />                 @Override <br />                 public void onClick(View v) { <br />                     Intent intent=new Intent(); <br />                     intent.setClass(ActB.this, ActA.class); <br />                     startActivity(intent); <br />                 } <br />             }); <br />             LinearLayout layout=new LinearLayout(this); <br />             layout.addView(button); <br />             this.setContentView(layout); <br />     } <br /> }</p> <p> </p> </blockquote> <p>ActB¾cÖM‹É用默认(standardåQ‰åŠ è½½ï¼ŒActA使用singleTop加蝲。结果类ä¼ég¸‹å›¾ï¼š(x¨¬)</p> <p><a ><img style="border: 0px none; display: inline;" title="image" alt="image" src="http://marshal.easymorse.com/wp-content/uploads/2010/07/image_thumb59.png" border="0" height="211" width="244" /></a> </p> <p>如果把ActA的加载模式改为standardåQŒæƒ…况一栗÷€?/p> <h4>singleTask</h4> <p>singleTask模式和后面的singleInstance模式都是只创å»ÞZ¸€ä¸ªå®žä¾‹çš„ã€?/p> <p>当intent到来åQŒéœ€è¦åˆ›å»ºsingleTask模式Activity的时候,¾pȝ»Ÿä¼?x¨¬)检查栈里面是否已经有该Activity的实例。如果有直接ž®†intent发送给它ã€?/p> <p>把上面singleTop的实例中的ActAçš„launchModeæ”¹äØ“(f¨´)singleTaskåQŒActB的改为standard。那么会(x¨¬)发现在ActA界面中按一‹Æ¡æŒ‰é’®ï¼š(x¨¬)</p> <p><a ><img style="border: 0px none; display: inline;" title="image" alt="image" src="http://marshal.easymorse.com/wp-content/uploads/2010/07/image_thumb60.png" border="0" height="217" width="244" /></a> </p> <p>然后在ActB1界面中按按钮åQŒå› ä¸ºActA是singleTaskåQŒä¼š(x¨¬)使用原来的ActA1实例。这时候栈内的情况:</p> <p><a ><img style="border: 0px none; display: inline;" title="image" alt="image" src="http://marshal.easymorse.com/wp-content/uploads/2010/07/image_thumb61.png" border="0" height="134" width="244" /></a></p> <p>如果多次按按钮蟩转,ä¼?x¨¬)发现始¾lˆåªæœ‰ActA1˜q™ä¸€ä¸ªActA¾cȝš„实例ã€?</p> <h4>singleInstance</h4> <p>解释singleInstance模式比较éºÈƒ¦ã€?/p> <p>首先要说一下TaskåQˆä“Q务)的概å¿üc(di¨£n)€?/p> <p>如果是Swing或者Windows½E‹åºåQŒå¯èƒ½æœ‰å¤šä¸ª½H—口可以切换åQŒä½†æ˜¯ä½ æ— æ³•在自å·Þq¨‹åºä¸­å¤ç”¨äººå®¶çš„窗口。注意是直接复用人家的二˜q›åˆ¶ä»£ç åQŒä¸æ˜¯ä½ æ‹¿åˆ°äººå®¶api后的源代码çñ”调用ã€?/p> <p>Android可以做到åQŒè®©åˆ«äh的程序直接复用你的ActivityåQˆç±»ä¼¼æ¡Œé¢ç¨‹åºçš„½H—口åQ‰ã€?/p> <p>Android为提供这¿UæœºåˆÓž¼Œž®±å¼•入了Task的概å¿üc(di¨£n)€‚Taskå¯ä»¥è®¤äØ“(f¨´)是一个栈åQŒå¯æ”‘Ö…¥å¤šä¸ªActivity。比如启动一个应用,那么 Androidž®±åˆ›å»ÞZº†ä¸€ä¸ªTaskåQŒç„¶åŽå¯åŠ¨è¿™ä¸ªåº”ç”¨çš„å…¥å£ActivityåQŒå°±æ˜¯intent-filter中配¾|®äØ“(f¨´)mainå’Œlaunch的那ä¸? åQˆè§<a title="一个APKæ–‡äšg部çÖv产生多个应用安装的效æž?>一个APKæ–‡äšg部çÖv产生多个应用安装的效æž?/a>åQ‰ã€‚这个Activity是根åQˆRootåQ‰ActivityåQŒå¯èƒ½ä¼š(x¨¬)在它的界面调用其他ActivityåQŒè¿™äº›Activity如果按照上面那三个模式,也会(x¨¬)在这个栈åQˆTaskåQ‰ä¸­åQŒåªæ˜¯å®žä¾‹åŒ–的策略不同而已ã€?/p> <p>验证的办法是调用和打印Activityçš„taskIdåQ?/p> <blockquote> <p>TextView textView2 = new TextView(this); <br /> textView2.setText("task id: "+this.getTaskId());</p> </blockquote> <p>ä¼?x¨¬)发玎ͼŒæ— è®ºåˆ‡æ¢ActivityåQŒtaskId是相同的ã€?/p> <p>当然也可以在˜q™ä¸ªå•一的Task栈中åQŒæ”¾å…¥åˆ«äººçš„ActivityåQŒæ¯”如google地图åQŒè¿™æ ïL(f¨¥ng)”¨æˆïL(f¨¥ng)œ‹˜q‡åœ°å›¾æŒ‰å›žé€€é”®çš„æ—¶å€™ï¼Œä¼?x¨¬)退栈回到调用地囄¡š„Activity。对用户来说åQŒåƈ不觉得在操作多个应用。这ž®±æ˜¯Task的作用ã€?/p> <p>但是åQŒæœ‰˜q™æ ·çš„需求,多个Taskå…׃ín一个ActivityåQˆsingleTask是在一个task中共享一个ActivityåQ‰ã€?/p> <p>现成的例子是google地图。比如我有一个应用是导游斚w¢çš„,其中调用的google地图Activity。那么现在我比如按home键,然后到应用列表中打开google地图åQŒä½ ä¼?x¨¬)发现显½Cºçš„ž®±æ˜¯åˆšæ‰çš„地图,实际上是同一个Activityã€?/p> <p>如果使用上面三种模式åQŒæ˜¯æ— æ³•实现˜q™ä¸ªéœ€æ±‚的。google地图应用中有多个上下文ActivityåQŒæ¯”如èµ\¾U¿æŸ¥è¯¢ç­‰çš„,导游应用也有一些上下文Activity。在各自应用中回退要回退到各自的上下文Activity中ã€?/p> <p>singleInstance模式解决了这个问题(¾l•了˜q™ä¹ˆåŠå¤©æ‰è¯´åˆ°æ­£é¢˜ï¼‰ã€‚让˜q™ä¸ªæ¨¡å¼ä¸‹çš„Activity单独在一个task栈中。这个栈只有一个Activity。导游应用和google地图应用发送的intent都由˜q™ä¸ªActivity接收和展½Cºã€?/p> <p>˜q™é‡Œåˆæœ‰ä¸¤ä¸ªé—®é¢˜åQ?/p> <ul> <li>如果是这¿Uæƒ…况,多个task栈也可以看作一个应用。比如导游应用启动地图ActivityåQŒå®žé™…上是在导游应用task栈之ä¸? singleInstance模式创徏的(如果˜q˜æ²¡æœ‰çš„话,如果有就是直接显½Cºå®ƒåQ‰ä¸€ä¸ªæ–°æ ˆï¼Œå½“这个栈里面的唯一ActivityåQŒåœ°å›¾Activity 回退的时候,只是把这个栈¿UÕd¼€äº†ï¼Œ˜q™æ ·ž®Þqœ‹åˆ°å¯¼æ¸¸åº”用刚才的Activity了;</li> <li>多个应用åQˆTaskåQ‰å…±äº«ä¸€ä¸ªActivity要求˜q™äº›åº”ç”¨éƒ½æ²¡æœ‰é€€å‡ºï¼Œæ¯”å¦‚åˆšæ‰å¼ø™°ƒè¦ç”¨home键从导游应用切换到地囑ֺ”用。因为,如果退出导游应用,而这时也地图应用òq¶æœª˜qè¡Œçš„话åQŒé‚£ä¸ªå•独的地图ActivityåQˆtaskåQ‰ä¹Ÿä¼?x¨¬)退å‡ÞZº†ã€?/li> </ul> <p>如果˜q˜æ˜¯æ‹¿åˆšæ‰çš„ActAå’ŒActB的示例,可以把ActB的模式改为singleInstanceåQŒActA为standardåQŒå¦‚果按一‹Æ¡æŒ‰é’®åˆ‡æ¢åˆ°ActBåQŒçœ‹åˆ°çŽ°è±¡ç”¨½Cºæ„å›„¡±»ä¼ÆD¿™æ øP¼š(x¨¬)</p> <p><a ><img style="border: 0px none; display: inline;" title="image" alt="image" src="http://marshal.easymorse.com/wp-content/uploads/2010/07/image_thumb62.png" border="0" height="222" width="244" /></a> </p> <p>如果是第一‹Æ¡æŒ‰é’®åˆ‡æ¢åˆ°ActBåQŒåœ¨ActB在按按钮切换到ActAåQŒç„¶åŽå†å›žé€€åQŒç¤ºæ„å›¾æ˜¯ï¼š(x¨¬)</p> <p><a ><img style="border: 0px none; display: inline;" title="image" alt="image" src="http://marshal.easymorse.com/wp-content/uploads/2010/07/image_thumb63.png" border="0" height="166" width="342" /></a> </p> <p>另外åQŒå¯ä»¥çœ‹åˆîC¸¤ä¸ªActivityçš„taskId是不同的ã€?/p> </div> <img src ="http://www.aygfsteel.com/caizh2009/aggbug/340227.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/caizh2009/" target="_blank">ž®èœæ¯›æ¯›</a> 2010-12-10 10:38 <a href="http://www.aygfsteel.com/caizh2009/archive/2010/12/10/340227.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>¾_‘Ö“Android源码推荐http://www.aygfsteel.com/caizh2009/archive/2010/12/03/339710.htmlž®èœæ¯›æ¯›ž®èœæ¯›æ¯›Fri, 03 Dec 2010 04:39:00 GMThttp://www.aygfsteel.com/caizh2009/archive/2010/12/03/339710.htmlhttp://www.aygfsteel.com/caizh2009/comments/339710.htmlhttp://www.aygfsteel.com/caizh2009/archive/2010/12/03/339710.html#Feedback0http://www.aygfsteel.com/caizh2009/comments/commentRss/339710.htmlhttp://www.aygfsteel.com/caizh2009/services/trackbacks/339710.html从零开始Android游戏¾~–程
    五子‹‚‹æºç ?/a>
    Read RSS on OPhone
    俄罗斯方�/a>
    ½Iºæˆ˜æ¸¸æˆ1945
    加速传感器演示
    演示如何使用Location和Google Map
    个股宝典
    ˜qžè¿žçœ?/a>
    ½{–略游戏——回到战å›?android源代ç ?/a>
    滚屏动作游戏——太½IÞZ¿å«æˆ˜ android源代ç ?/a>
    冒险游戏——胜利大逃亡 android源代�/a>
    体育游戏——疯狂èƒöç?android源代ç ?附äšg
    æ°´æ‡L效应android源码
    Android ä¸?Dèµ›èžR游戏
    扫雷游戏åQŒandroid源码åQŒæœ‰æ³¨è§£
    MP3切割�/a>
    Android国际象棋源码
    旅行记录软äšg源码
    DroidReader 源码
    Android下的VOIP客户端源�/a>
    Android下的FTP服务器源�/a>
    Android下俄¾|—斯方块源码

    ]]>
    Android高手˜q›é˜¶æ•™ç¨‹(å›?ä¹?---Android 中自定义属æ€?attr.xml,TypedArray)çš„ä‹Éç”?(è½?http://www.aygfsteel.com/caizh2009/archive/2010/11/23/338805.htmlž®èœæ¯›æ¯›ž®èœæ¯›æ¯›Tue, 23 Nov 2010 07:22:00 GMThttp://www.aygfsteel.com/caizh2009/archive/2010/11/23/338805.htmlhttp://www.aygfsteel.com/caizh2009/comments/338805.htmlhttp://www.aygfsteel.com/caizh2009/archive/2010/11/23/338805.html#Feedback0http://www.aygfsteel.com/caizh2009/comments/commentRss/338805.htmlhttp://www.aygfsteel.com/caizh2009/services/trackbacks/338805.html阅读全文

    ]]>
    Android高手˜q›é˜¶æ•™ç¨‹(äº?ä¹?---Android 中LayoutInflaterçš„ä‹É用(转)http://www.aygfsteel.com/caizh2009/archive/2010/11/23/338803.htmlž®èœæ¯›æ¯›ž®èœæ¯›æ¯›Tue, 23 Nov 2010 07:20:00 GMThttp://www.aygfsteel.com/caizh2009/archive/2010/11/23/338803.htmlhttp://www.aygfsteel.com/caizh2009/comments/338803.htmlhttp://www.aygfsteel.com/caizh2009/archive/2010/11/23/338803.html#Feedback0http://www.aygfsteel.com/caizh2009/comments/commentRss/338803.htmlhttp://www.aygfsteel.com/caizh2009/services/trackbacks/338803.html阅读全文

    ]]>
    为程序添加版本自动更新功èƒ?è½?详细分析)http://www.aygfsteel.com/caizh2009/archive/2010/11/23/338763.htmlž®èœæ¯›æ¯›ž®èœæ¯›æ¯›Tue, 23 Nov 2010 03:07:00 GMThttp://www.aygfsteel.com/caizh2009/archive/2010/11/23/338763.htmlhttp://www.aygfsteel.com/caizh2009/comments/338763.htmlhttp://www.aygfsteel.com/caizh2009/archive/2010/11/23/338763.html#Feedback0http://www.aygfsteel.com/caizh2009/comments/commentRss/338763.htmlhttp://www.aygfsteel.com/caizh2009/services/trackbacks/338763.htmlOverView:
    ½E‹åºé€šè¿‡åŽå°æ¯å¤©‹‚€æŸ¥æ˜¯å¦æœ‰æœ€æ–°ç‰ˆæœ¬ï¼Œå¦‚果需要更新当前版本,ž®†å¼¹å‡ºå¯¹è¯æ¡†è®©ç”¨æˆ·é€‰æ‹©æ˜¯å¦åœ¨å½“前通过Market来更æ–?span class="t_tag">软äšgã€?br /> Knowledge Points:
    • SharedPreferences: 一个轻量çñ”的存储方法,¾cÖM¼¼äºŽç»å¸æ€‹É用的.iniæ–‡äšgåQŒå®ƒä¹Ÿæ˜¯é€šè¿‡‹‚€ç´¢å…³é”®å­—来取得相应的数倹{€‚ä¹‹æ‰€ä»¥æ˜¯æˆäØ“(f¨´)轻量¾U§ï¼Œæ˜¯å› ä¸ºå®ƒæ‰€èƒ?span class="t_tag">应用的数值类型有限,对于存储较大数å€û|¼Œæ•ˆçŽ‡ç›¸å¯¹è¾ƒä½Žã€?a target="_blank">官方参è€?/a>
    • System.currentTimeMillis:ž®†å½“å‰?span class="t_tag">æ—‰™—´ä»¥æ¯«¿U’作为单位来表示åQŒç”¨äºŽæ¯”较两个时间的先后™åºåºã€‚ï¼ˆå…¶æ•°å€ÆD¡¨½CÞZ»Ž1970-01-01 00:00:00直到当前旉™—´çš„æ€ÀL¯«¿U’æ•°åQ?a target="_blank">官方参è€?/a>
    • 通过¾|‘络来读取信息:(x¨¬)在checkUpdate()æ–ÒŽ(gu¨©)³•中包含了通过制定的URL来读取网¾lœèµ„源。具体操作步骤,请参考源代码ã€?/li>
    • Runnable: 在其内部的Run()æ–ÒŽ(gu¨©)³•中实现所要执行的ä»ÖM½•代码åQŒå½“˜q™ä¸ªrunnable interface被调用后可以视作为新的线½E‹ã€?/li>
    Source CodeåQ?/strong>
    1. public class hello extends Activity  {
    2.         /** Called when the activity is first created. */
    3.         private Handler mHandler;
    4.          
    5.     @Override
    6.     public void onCreate(Bundle savedInstanceState) {
    7.         super.onCreate(savedInstanceState);
    8.         setContentView(R.layout.main);
    9.         
    10.         mHandler = new Handler();

    11.         /* Get Last Update Time from Preferences */
    12.         SharedPreferences prefs = getPreferences(0);
    13.         long lastUpdateTime =  prefs.getLong("lastUpdateTime", System.currentTimeMillis());

    14.         int curVersion = 0;
    15.                 try {
    16.                         curVersion = getPackageManager().getPackageInfo("linhai.com.hello", 0).versionCode;
    17.                 } catch (NameNotFoundException e) {
    18.                         // TODO Auto-generated catch block
    19.                         e.printStackTrace();
    20.                 }
    21.         Log.i("DEMO",String.valueOf(curVersion));
    22.         /* Should Activity Check for Updates Now? */
    23.         if ((lastUpdateTime + (24 * 60 * 60 * 1000)) < System.currentTimeMillis()) {

    24.             /* Save current timestamp for next Check*/
    25.            lastUpdateTime = System.currentTimeMillis();
    26.             SharedPreferences.Editor editor = getPreferences(0).edit();
    27.             editor.putLong("lastUpdateTime", lastUpdateTime);
    28.             editor.commit();      

    29.             /* Start Update */
    30.          //   checkUpdate.start();
    31.         }
    32.     }

    33.     /* This Thread checks for Updates in the Background */
    34.     private Thread checkUpdate = new Thread()
    35.     {
    36.         public void run() {
    37.             try {
    38.                 URL updateURL = new URL("http://my.company.com/update");
    39.                 URLConnection conn = updateURL.openConnection();
    40.                 InputStream is = conn.getInputStream();
    41.                 BufferedInputStream bis = new BufferedInputStream(is);
    42.                 ByteArrayBuffer baf = new ByteArrayBuffer(50);

    43.                 int current = 0;
    44.                 while((current = bis.read()) != -1){
    45.                      baf.append((byte)current);
    46.                 }

    47.                 /* Convert the Bytes read to a String. */
    48.                 final String s = new String(baf.toByteArray());        

    49.                 /* Get current Version Number */
    50.                 int curVersion = getPackageManager().getPackageInfo("your.app.id", 0).versionCode;
    51.                 int newVersion = Integer.valueOf(s);

    52.                 /* Is a higher version than the current already out? */
    53.                 if (newVersion > curVersion) {
    54.                     /* Post a Handler for the UI to pick up and open the Dialog */
    55.                     mHandler.post(showUpdate);
    56.                 }
    57.             } catch (Exception e) {
    58.             }
    59.         }
    60.     };

    61.     /* This Runnable creates a Dialog and asks the user to open the Market */
    62.     private Runnable showUpdate = new Runnable(){
    63.            public void run(){
    64.             new AlertDialog.Builder(hello.this)
    65.             .setIcon(R.drawable.ok)
    66.             .setTitle("Update Available")
    67.             .setMessage("An update for is available!\n\nOpen Android Market and see the details?")
    68.             .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
    69.                     public void onClick(DialogInterface dialog, int whichButton) {
    70.                             /* User clicked OK so do some stuff */
    71.                             Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("market://search?q=pname:your.app.id"));
    72.                             startActivity(intent);
    73.                     }
    74.             })
    75.             .setNegativeButton("No", new DialogInterface.OnClickListener() {
    76.                     public void onClick(DialogInterface dialog, int whichButton) {
    77.                             /* User clicked Cancel */
    78.                     }
    79.             })
    80.             .show();
    81.            }
    82.     };
    83.   
    84. }
    复制代码


    åˆ†äØ“(f¨´)三个部分åQ?br />
    • ¾|®äºŽonCreate()æ–ÒŽ(gu¨©)³•中的½E‹åºç”¨äºŽåˆ¤æ–­å½“前旉™—´æ˜¯å¦éœ€è¦æ£€æŸ¥æ›´æ–ŽÍ¼ˆå¦‚果距离上次更新旉™—´å¤§äºŽ1天,ž®†å¯åŠ¨æ£€æŸ¥æ›´æ–ŽÍ¼‰
    • 当以上条件满­‘Ïx—¶åQŒå¯åЍcheckUpdateæ¥æ£€æŸ¥å½“å‰ç¨‹åºæ˜¯å¦äØ“(f¨´)最新版本ã€?/li>
    • 如果¼‹®å®šç‰ˆæœ¬å·²è¿‡æœŸï¼Œé‚£ä¹ˆž®†ç™»å½•marketåQŒåƈ直接指向当前½E‹åº™åµé¢ã€?/li>
    *******************************************************************************************
    向上­a€åQ?br />      æœ¬ähåœ?span class="t_tag">论坛曄¡»å‘过一关于此问题的求助帖,虽然大至的思èµ\和上文差不多åQŒå…³é”®ç‚¹æ˜¯åœ¨äºŽç¨‹åºå¦‚何更斎ͼŒçŽ°åœ¨çœ‹åˆ°å®ƒè¿™é‡ŒæŒ‡å‡ºçš„æ›´æ–°æ–ÒŽ(gu¨©)³•居然是登录market。不˜q‡ä»¥åŽå‘布的½E‹åºéƒ½æ˜¯åœ¨market中,问题ž®×ƒ¸å­˜åœ¨ã€?
    1.                             Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("market://search?q=pname:your.app.id"));
    2.                             startActivity(intent);
    复制代码
    大家都是在eclipseä¸?span class="t_tag">å¼€å?/span>吧,在每‹Æ¡æ›´æ–îC»£ç ï¼Œ˜qè¡Œæ¨¡æ‹Ÿå™¨æ—¶åQŒå¤§å®¶æ˜¯å¦æœ‰æ³¨æ„åˆ°console的提½CÞZ¿¡æ¯ï¼š(x¨¬)
    1. [2009-06-06 19:53:50 - Hello] Android Launch!
    2. [2009-06-06 19:53:50 - Hello] adb is running normally.
    3. [2009-06-06 19:53:50 - Hello] Performing linhai.com.hello.hello activity launch
    4. [2009-06-06 19:53:50 - Hello] Automatic Target Mode: using existing emulator 'emulator-5554' running compatible AVD 'avd'
    5. [2009-06-06 19:53:50 - Hello] WARNING: Application does not specify an API level requirement!
    6. [2009-06-06 19:53:50 - Hello] Device API version is 3 (Android 1.5)
    7. [2009-06-06 19:53:50 - Hello] Uploading Hello.apk onto device 'emulator-5554'
    8. [2009-06-06 19:53:50 - Hello] Installing Hello.apk...
    9. [2009-06-06 19:54:05 - Hello] Application already exists. Attempting to re-install instead...
    10. [2009-06-06 19:54:31 - Hello] Success!
    复制代码
    分析åQ?br /> 1ã€?span class="t_tag">android正常˜qè¡Œ
    2。通过配置文äšgAndroidManifest.xml中运行我们的½E‹åº
    3ã€?font color="Red">Uploading Hello.apk onto device 'emulator-5554'˜q™å¥æ˜¯å…³é”®ï¼Œæ›´æ–°æˆ‘们的程åº?br /> 4ã€?font color="Red">Installing Hello.apk...
    5ã€?font color="Red">Application already exists. Attempting to re-install instead...//½E‹åºå·²ç»å­˜åœ¨åQŒå°è¯•重新安è£?br />
    所以如果我们的½E‹åºè¦?span class="t_tag">自动更新åQŒæœ¬äººåˆæ­¥çŒœæƒÏx˜¯å’Œä¸Šé¢çš„æ­¥éª¤æ˜¯ä¸€æ ïL(f¨¥ng)š„ã€?br /> 详看logcat中的log
    1. 06-06 11:54:02.567: DEBUG/PackageParser(582): Scanning package: /data/app/vmdl12464.tmp
    2. 06-06 11:54:08.048: INFO/PackageManager(582): Removing non-system package:linhai.com.hello
    3. 06-06 11:54:08.187: DEBUG/PackageManager(582): Removing package linhai.com.hello
    4. 06-06 11:54:08.286: DEBUG/PackageManager(582):   Activities: linhai.com.hello.hello
    5. 06-06 11:54:11.136: DEBUG/PackageManager(582): Scanning package linhai.com.hello
    6. 06-06 11:54:11.301: INFO/PackageManager(582): /data/app/vmdl12464.tmp changed; unpacking
    7. 06-06 11:54:11.626: DEBUG/installd(555): DexInv: --- BEGIN '/data/app/vmdl12464.tmp' ---
    8. 06-06 11:54:12.987: DEBUG/dalvikvm(7756): DexOpt: load 224ms, verify 265ms, opt 1ms
    9. 06-06 11:54:13.047: DEBUG/installd(555): DexInv: --- END '/data/app/vmdl12464.tmp' (success) ---
    10. 06-06 11:54:13.057: DEBUG/PackageManager(582):   Activities: linhai.com.hello.hello
    11. 06-06 11:54:15.608: INFO/installd(555): move /data/dalvik-cache/data@app@vmdl12464.tmp@classes.dex -> /data/dalvik-cache/data@app@linhai.com.hello.apk@classes.dex
    12. 06-06 11:54:15.737: DEBUG/PackageManager(582): New package installed in /data/app/linhai.com.hello.apk
    复制代码
    关于此类的自动更新的½W¬ä¸‰æ–¹ç®¡ç†èÊYä»¶å·²¾læœ‰äº†å«aTrackDog,其原理就是ä‹É用上面的方式ã€?br /> å…³äºŽå¾—åˆ°ç‰ˆæœ¬åøP¼Œä½¿ç”¨åQ?
    1. int curVersion = getPackageManager().getPackageInfo("your.app.id", 0).versionCode;
    复制代码
    ½E‹åºç‰ˆæœ¬åïL(f¨¥ng)š„æ˜¯æ”¾åœ¨AndroidManifest.xmlæ–‡äšg中:(x¨¬)
    1. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    2.         package="linhai.com.hello" android:versionCode="2" android:versionName="2.0.1">
    复制代码
    ä¸È‚¹æ˜¯å…³äºŽï¼š(x¨¬)getPackageManager()在这个下面有很多æ–ÒŽ(gu¨©)³•åQŒä½ å¯ä»¥é€šè¿‡å®ƒå¾—åQŒå¾—到当前终端安装的½E‹åº½{‰ã€‚关于安装包的函数是åQšgetPackageManager().installPackage(packageURI)

    动手试验åQ?br /> 在dos状态下˜qè¡ŒåQ?br /> 1.JPG
    查看logcat下的信息,大致和刚才相同,分析‹¹ç¨‹åQ?
    1. 06-06 12:18:58.827: INFO/jdwp(8368): received file descriptor 20 from ADB
    2. 06-06 12:19:02.546: DEBUG/PackageParser(582): Scanning package: /data/app/vmdl12465.tmp
    3. 06-06 12:19:07.738: INFO/PackageManager(582): /data/app/vmdl12465.tmp changed; unpacking
    4. 06-06 12:19:07.978: DEBUG/installd(555): DexInv: --- BEGIN '/data/app/vmdl12465.tmp' ---
    5. 06-06 12:19:09.617: DEBUG/dalvikvm(8378): DexOpt: load 254ms, verify 564ms, opt 3ms
    6. 06-06 12:19:09.697: DEBUG/installd(555): DexInv: --- END '/data/app/vmdl12465.tmp' (success) ---
    7. 06-06 12:19:11.907: INFO/installd(555): move /data/dalvik-cache/data@app@vmdl12465.tmp@classes.dex -> /data/dalvik-cache/data@app@com.example.android.snake.apk@classes.dex
    8. 06-06 12:19:11.956: DEBUG/PackageManager(582): New package installed in /data/app/com.example.android.snake.apk
    9. 06-06 12:19:14.746: DEBUG/dalvikvm(8368): VM cleaning up
    10. 06-06 12:19:14.857: DEBUG/dalvikvm(8368): LinearAlloc 0x0 used 628420 of 4194304 (14%)
    11. 06-06 12:19:15.897: DEBUG/dalvikvm(582): GC freed 17704 objects / 903984 bytes in 615ms
    12. 06-06 12:19:15.936: DEBUG/HomeLoaders(625): application intent received: android.intent.action.PACKAGE_ADDED, replacing=false
    13. 06-06 12:19:15.936: DEBUG/HomeLoaders(625):   --> package:com.example.android.snake
    14. 06-06 12:19:15.936: DEBUG/HomeLoaders(625):   --> add package
    复制代码
    1。接æ”?span class="t_tag">数据åQŒä¿å­˜åˆ°ä¸´æ—¶æ–‡äšgä¸?data/app/vmdl12465.tmp
    2。解压此文äšgåQŒæ³¨æ„èµ\å¾?data/dalvik-cache/data@app@vmdl12465.tmp@classes.dex
    它是在data下的dalvik-cacheä¸?br /> 3.安装文äšg[˜q™ä¸ªæ­¥éª¤˜q˜åŒ…括查扄¡¨‹åºæ˜¯å¦å·²¾lå®‰è£…ç­‰]
    4.使用GC清理内存

    查看DDMS中的¾l“æž„
    2.JPG
    看到此文件结构,应该可以惌™“vlinux下的文äšg¾pȝ»Ÿå’Œå®ƒçš„æƒé™ç®¡ç†ï¼Œä¹Ÿå°±å¯ä»¥ç†è§£åQŒäØ“(f¨´)什么我们的½E‹åºæ— æ³•在data下创建文件之¾cȝš„问题了ã€?br /> 转蝲åQ?a target="_blank">http://www.androidres.com/?p=349

    ]]>
    构徏自定义组ä»?/title><link>http://www.aygfsteel.com/caizh2009/archive/2010/11/23/338757.html</link><dc:creator>ž®èœæ¯›æ¯›</dc:creator><author>ž®èœæ¯›æ¯›</author><pubDate>Tue, 23 Nov 2010 02:19:00 GMT</pubDate><guid>http://www.aygfsteel.com/caizh2009/archive/2010/11/23/338757.html</guid><wfw:comment>http://www.aygfsteel.com/caizh2009/comments/338757.html</wfw:comment><comments>http://www.aygfsteel.com/caizh2009/archive/2010/11/23/338757.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/caizh2009/comments/commentRss/338757.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/caizh2009/services/trackbacks/338757.html</trackback:ping><description><![CDATA[<p>ndroid中,你的应用½E‹åº½E‹åºä¸ŽView¾cȝ»„件有着一¿Uå›ºå®šçš„联系åQŒä¾‹å¦?a ><span style="color: #439740;">按钮åQˆButtonåQ?/span></a>ã€?<a ><span style="color: #439740;">文本框(TextViewåQ?/span></a>, <a ><span style="color: #439740;">可编辑文本框åQˆEditTextåQ?/span></a>, <a ><span style="color: #439740;">列表框(ListViewåQ?/span></a>, <a ><span style="color: #439740;">复选框åQˆCheckBoxåQ?/span></a>, <a ><span style="color: #439740;">单选框åQˆRadioButtonåQ?/span></a>, <a ><span style="color: #439740;">滚动条(GalleryåQ?/span></a>, <a ><span style="color: #439740;">微调器(SpinneråQ?/span></a>, ½{‰ç­‰åQŒè¿˜æœ‰ä¸€äº›æ¯”较先˜q›çš„æœ‰ç€ç‰ÒŽ(gu¨©)®Šç”¨é€”çš„View¾l„äšgåQŒä¾‹å¦?<a ><span style="color: #439740;">AutoCompleteTextView</span></a>, <a ><span style="color: #439740;">ImageSwitcher</span></a>å’?<a ><span style="color: #439740;">TextSwitcher</span></a>。除此之外,¿Uç±»¾Jå¤šçš„像 <a ><span style="color: #439740;">¾U¿æ€§å¸ƒå±€åQˆLinearLayoutåQ?/span></a>, <a ><span style="color: #439740;">框架布局åQˆF(tu¨¢n)rameLayoutåQ?/span></a>, ˜q™æ ·çš„布局¾l„äšgåQˆLayoutåQ‰ä¹Ÿè¢«è®¤ä¸ºæ˜¯View¾l„äšgåQŒä»–们是从View¾cÀL´¾ç”Ÿè¿‡æ¥çš„ã€?/p> <p>你的应用½E‹åºž®±æ˜¯˜q™äº›æŽ§åˆ¶¾l„äšg和布局¾l„äšg以某¿Uæ–¹å¼ç»“合显½Cºåœ¨å±å¹•上,一般来说这些组件对你来说基本够用,但是你也应该知道你是可以通过¾cȝ‘ô承创å»? 属于自己的组ä»Óž¼Œä¸€èˆ¬å¯ä»¥ç‘ô承像View、LayoutsåQˆå¸ƒå±€¾l„äšgåQ‰è¿™æ ïL(f¨¥ng)š„¾l„äšgåQŒç”šè‡›_¯ä»¥æ˜¯ä¸€äº›æ¯”较高¾U§çš„æŽ§åˆ¶¾cȝ»„ä»¶ã€‚ä¸‹é¢æˆ‘ä»¬è¯´ä¸€ä¸‹äØ“(f¨´)什么要¾l§æ‰¿åQ?/p> <ul> <li>ä½ å¯ä»¥äØ“(f¨´)实现某种功能创徏一个完全自定义风格的组ä»Óž¼Œä¾‹å¦‚用二¾l´çš„囑ÖŞ创徏控制¾l„äšg实现声音的控åˆÓž¼Œž®±åƒç”?sh¨´)子控制一栗÷€?</li> <li>你可以把几种¾l„äšg¾l“合形成一个新的组ä»Óž¼Œä½ çš„¾l„äšg可能同时包含ComboBoxåQˆä¸€ä¸ªèƒ½è¾“入的文本列表)和dual-pane selector controlåQˆå·¦å³ä¸¤ä¸ªList½H—口åQŒä½ å¯ä»¥åˆ†é…½H—口每一™å¹çš„从属关系åQ‰ç­‰½{‰ã€?</li> <li>ä½ å¯ä»¥åˆ›å»ø™‡ªå·Þqš„布局¾l„äšgåQˆLayoutåQ‰ã€‚SDK中的布局¾l„äšg已经提供了一¾pÕdˆ—的选项让你打造属于自å·Þqš„应用½E‹åºåQŒä½†æ˜¯é«˜¾U§çš„开发äh员会(x¨¬)发现æ ÒŽ(gu¨©)®çŽ°æœ‰çš„Layout¾l„äšg开发新的Layout¾l„äšg是很有必要的åQŒç”šè‡Ïx˜¯å®Œå…¨ä»Žåº•层开发新的组件ã€?</li> <li>你可以覆盖一个现有组件的昄¡¤ºæˆ–功能。例如,改变EditTextåQˆå¯¾~–辑文本åQ‰ç»„件在屏幕上的昄¡¤ºæ–¹å¼åQˆå¯ä»¥å‚考Notepad的例子,里面教你如何创徏一个下划线的显½Cºé¡µé¢ï¼‰ã€?</li> <li>你可以捕获像按键按下˜q™æ ·çš„事ä»Óž¼Œä»¥ä¸€äº›é€šç”¨çš„æ–¹æ³•来处理˜q™äº›äº‹äšgåQˆä¸€ä¸ªæ¸¸æˆçš„例子åQ‰ã€?</li> </ul> <p>ä¸ÞZº†å®žçŽ°æŸç§ç›®æ ‡ä½ å¯èƒ½å¾ˆæœ‰å¿…è¦æ‰©å±•ä¸€ä¸ªå·²¾lå­˜åœ¨çš„View¾l„äšgåQŒä¸‹é¢æˆ‘们结合一些例子教你如何去做ã€?</p> <h2 style="clear: right;">内容åQ?/h2> <dl><dt><a ><span style="color: #439740;">基本æ–ÒŽ(gu¨©)³•åQˆThe Basic Approach åQ?/span></a> </dt><dt><a ><span style="color: #439740;">完全自定义组ä»Óž¼ˆF(tu¨¢n)ully Customized Components åQ?/span></a> </dt><dt><a ><span style="color: #439740;">定制¾l„äšg的例子(Customized Component Example åQ?/span></a> </dt><dt><a ><span style="color: #439740;">¾l„äšgçš„æØœåˆï¼ˆæˆ–è€…æŽ§åˆ¶ç±»çš„æØœåˆï¼‰ åQˆCompound Components (or Compound Controls) åQ?/span></a> </dt><dt><a ><span style="color: #439740;">修改现有¾l„äšgåQˆTweaking an Existing Component åQ?/span></a> </dt><dt><a ><span style="color: #439740;">ž®ç»“åQˆGo Forth and Componentize åQ?/span></a> </dt></dl> <p><a></a></p> <h2>基本æ–ÒŽ(gu¨©)³•åQˆThe Basic Approach åQ?</h2> <p>下面的一些步骤都比较概括åQŒæ•™ä½ å¦‚ä½•åˆ›å»ø™‡ªå·Þqš„¾l„äšgåQ?/p> <ol> <li>让你的类åQˆClassåQ‰ç‘ô承一个现有的<a ><span style="color: #439740;">View</span></a> ¾cÀLˆ–<a ><span style="color: #439740;">View</span></a>的子¾c…R€?</li> <li>重蝲父类的一些方法:(x¨¬)需要重载的父类æ–ÒŽ(gu¨©)³•一般以‘<code>on</code>’å¼€å¤ß_(d¨¢)¼Œå¦?a ><span style="color: #439740;">onDraw()</span></a>, <a ><span style="color: #439740;">onMeasure()</span></a>å’?<a ><span style="color: #439740;">onKeyDown()</span></a>½{‰ç­‰ã€? <ul> <li>˜q™ä¸ªåœ?a ><span style="color: #439740;">Activity</span></a> 或则 <a ><span style="color: #439740;">ListActivity</span></a> ‹z„¡”Ÿä¸­åŒæ ·é€‚用åQŒä½ éœ€è¦é‡è½½ä¸€äº›ç”Ÿå‘½å‘¨æœŸå‡½æ•°å’Œä¸€äº›å…¶ä»–功能性的HOOK函数ã€?</li> </ul> </li> <li>使用你的¾l§æ‰¿¾c»ï¼š(x¨¬)一旦你的ç‘ô承类创徏完成åQŒä½ å¯ä»¥åœ¨åŸº¾c»èƒ½å¤Ÿä‹É用的地方使用你的¾l§æ‰¿¾c»ï¼Œä½†å®ŒæˆåŠŸèƒ½å°±æ˜¯ä½ è‡ªå·±¾~–写的了ã€?</li> </ol> <p>¾l§æ‰¿¾c»èƒ½å¤Ÿå®šä¹‰åœ¨activities里面åQŒè¿™æ ·ä½ èƒ½å¤Ÿæ–¹ä¾¿çš„调用,但是˜q™åƈ不是必要的(或许在你的应用程序中你希望创å»ÞZ¸€ä¸ªæ‰€æœ‰äh都可以ä‹É用的¾l„äšgåQ‰ã€?</p> <p><a></a></p> <h2>完全自定义组ä»Óž¼ˆF(tu¨¢n)ully Customized ComponentsåQ?/h2> <p>完全自定义组件的æ–ÒŽ(gu¨©)³•可以创徏一些用于显½Cºçš„囑ÖÅž¾l„äšgåQˆgraphical componentsåQ‰ï¼Œä¹Ÿè®¸æ˜¯ä¸€ä¸ªåƒç”?sh¨´)压表的囑ÖŞ计量器,或者想卡拉OK里面昄¡¤ºæ­Œè¯çš„小球随着音乐滚动。无论那¿Uæ–¹å¼ï¼Œä½ ä¹Ÿä¸èƒ½å•纯的利用组件的¾l“合完成åQŒæ— è®ÞZ½ æ€Žä¹ˆ¾l“合˜q™äº›çŽ°æœ‰çš„ç»„ä»¶ã€?/p> <p>òq¸è¿çš„æ˜¯åQŒä½ å¯ä»¥ä»¥ä½ è‡ªå·±çš„要求轻村֜°åˆ›å¾å®Œå…¨å±žäºŽè‡ªå·±çš„组ä»Óž¼Œä½ ä¼š(x¨¬)发现不够用的只是你的惌™±¡åŠ›ã€å±òq•çš„ž®ºå¯¸å’Œå¤„理器的性能åQˆè®°ä½ä½ çš„应用程序最后只ä¼?x¨¬)在那些性能低于桌面ç”?sh¨´)è„‘çš„åã^åîC¸Šé¢è¿è¡Œï¼‰ã€?/p> <p>下面½Ž€å•介¾lå¦‚何打造完全自定义的组ä»Óž¼š(x¨¬)</p> <ol> <li>最为通用的VIEW¾cȝš„父类毫无疑问æ˜?a ><span style="color: #439740;">View</span></a>¾c»ï¼Œå› æ­¤åQŒæœ€å¼€å§‹ä½ è¦åˆ›å»ÞZ¸€ä¸ªåŸºäºŽæ­¤¾cȝš„一个子¾c…R€?</li> <li>你可以写一个构造函æ•îC»ŽXMLæ–‡äšg中提取属性和参数åQŒå½“然你也可以自己定义这些属性和参数åQˆä¹Ÿè®¸æ˜¯å›‘ÖŞ计量器的颜色和尺寸,或者是指针的宽度和òq…度½{‰ç­‰åQ?</li> <li>你可能有必要写自å·Þqš„事äšg监听器,属性的讉K—®å’Œä¿®æ”¹å‡½æ•°å’Œä¸€äº›ç»„件本íw«çš„功能上的代码ã€?</li> <li>如果你希望组件能够显½CÞZ»€ä¹ˆä¸œè¥¿ï¼Œä½ å¾ˆæœ‰å¯èƒ½ä¼š(x¨¬)重蝲 <code>onMeasure()</code> 函数åQŒå› è€Œä½ ž®×ƒ¸å¾—不重蝲 <code>onDraw()</code> 函数。当两个函数都用默认的,那么 <code>onDraw() </code>函数ž®†ä¸ä¼?x¨¬)做ä»ÖM½•事情åQŒåƈ且默认的 <code>onMeasure()</code> 函数自动的设¾|®äº†ä¸€ä¸?00x100 —的ž®ºå¯¸åQŒè¿™ä¸ªå°ºå¯¸å¯èƒ½åƈ不是你想要的ã€?</li> <li>其他有必要重载的<code>on...</code> ¾pÕdˆ—函数都需要重新写一‹Æ¡ã€?</li> </ol> <h4><code>onDraw()</code>å’?code>onMeasure()</code></h4> <p><code>onDraw()</code>函数ž®†ä¼š(x¨¬)传给你一ä¸?<a ><span style="color: #439740;">Canvas</span></a> 对象åQŒé€šè¿‡å®ƒä½ å¯ä»¥åœ¨äºŒ¾l´å›¾å½¢ä¸Šåšä“Q何事情,包括其他的一些标准和通用的组件、文本的格式åQŒä“Q何你可以惛_ˆ°çš„东襉Kƒ½å¯ä»¥é€šè¿‡å®ƒå®žçްã€?/p> <p><em>注意:</em> ˜q™é‡Œä¸åŒ…括三¾l´å›¾å½¢å¦‚果你想ä‹É用三¾l´çš„囑ÖÅžåQŒä½ åº”该把你的父¾cȝ”±Viewæ”¹äØ“(f¨´)<a ><span style="color: #439740;">SurfaceView</span></a>¾c»ï¼Œòq¶ä¸”用一个单独的¾U¿ç¨‹ã€‚可以参考GLSurfaceViewActivity 的例子ã€?</p> <p><code>onMeasure()</code> 函数有点‹‚˜æ‰‹åQŒå› ä¸ø™¿™ä¸ªå‡½æ•°æ˜¯ä½“现¾l„äšg和容器交互的关键部分åQ?em>onMeasureåQˆï¼‰</em>应该重蝲åQŒè®©å®ƒèƒ½å¤Ÿæœ‰æ•ˆè€Œå‡†¼‹®çš„表现它所包含部分的测量倹{€‚è¿™ž®±æœ‰ç‚¹å¤æ‚了åQŒå› ä¸ºæˆ‘们不但要考虑父类的限åˆÓž¼ˆé€šè¿‡<em>onMeasureåQˆï¼‰</em>传过来的åQ‰ï¼ŒåŒæ—¶æˆ‘们应该知道一旦测量宽度和高度出来后,ž®Þp¦ç«‹å³è°ƒç”¨<em>setMeasuredDimension()</em> æ–ÒŽ(gu¨©)³•ã€?</p> <p>概括的来è®ÔŒ¼Œæ‰§è¡Œ<code>onMeasure()</code>å‡½æ•°åˆ†äØ“(f¨´)一下几个阶ŒDµï¼š(x¨¬) </p> <ol> <li>重蝲çš?code>onMeasureåQˆï¼‰</code>æ–ÒŽ(gu¨©)³•ä¼?x¨¬)被调用åQŒé«˜åº¦å’Œå®½åº¦å‚数同时也会(x¨¬)涉及(qi¨¢ng)刎ͼˆ<code>widthMeasureSpec</code> å’?code>heighMeasureSpec</code>两个参数都是整数¾cÕdž‹åQ‰ï¼ŒåŒæ—¶ä½ åº”该考虑你äñ”品的ž®ºå¯¸é™åˆ¶ã€‚这里详¾l†çš„内容可以参è€?a ><span style="color: #439740;">View.onMeasure(int, int)</span></a> åQˆè¿™ä¸ªè¿žæŽ¥å†…容详¾l†çš„解释了整个measurement操作åQ‰ã€?</li> <li>ä½ çš„¾l„äšg要通过<code>onMeasureåQˆï¼‰</code>计算得到必要的measurement长度和宽度从而来昄¡¤ºä½ çš„¾l„äšgåQŒå®ƒåº”该与规æ ég¿æŒä¸€è‡ß_(d¨¢)¼Œž®½ç®¡å®ƒå¯ä»¥å®žçŽîC¸€äº›è§„æ ég»¥å¤–的功能åQˆåœ¨˜q™ä¸ªä¾‹å­é‡Œï¼Œçˆ¶ç±»èƒ½å¤Ÿé€‰æ‹©åšä»€ä¹ˆï¼ŒåŒ…括剪切、滑动、提交异常或者用不同的参数又一‹Æ¡è°ƒç”?code>onMeasureåQˆï¼‰</code>函数åQ‰ã€?</li> <li>一旦高度和宽度计算出来之后åQŒå¿…™å»è°ƒç”?code>setMeasuredDimension(int width, int height)</code>åQŒå¦åˆ™å°±ä¼?x¨¬)导致异常ã€?</li> </ol> <p><a></a></p> <h3>一个自定义¾l„äšg的例子(A Customized Component ExampleåQ?/h3> <p>åœ?<a ><span style="color: #439740;">API Demos</span></a> 中的CustomView提供了以一个自定义¾l„äšg的例子,˜q™ä¸ªè‡ªå®šä¹‰ç»„件在 <a ><span style="color: #439740;">LabelView</span></a> ¾cÖM¸­å®šä¹‰ã€?/p> <p>LabelView例子涉及(qi¨¢ng)åˆîCº†è‡ªå®šä¹‰ç»„ä»¶çš„æ–ÒŽ(gu¨©)–¹é¢é¢åQ?/p> <ul> <li>首先让自定义¾l„äšg从View¾cÖM¸­‹z„¡”Ÿå‡ºæ¥ã€?</li> <li>¾~–写带参数的构造函敎ͼˆå‚数可以来源于XMLæ–‡äšgåQ‰ã€‚这里面的一些处理都已经在View父类中完成,但是ä»È„¶æœ‰äº›Labelview使用的自定义¾l„äšgç‰ÒŽ(gu¨©)œ‰çš„æ–°çš„参数需要处理ã€?</li> <li>一些标准的Public函数åQŒä¾‹å¦?code>setText()</code>, <code>setTextSize()</code>, <code>setTextColor()</code> </li> <li>重蝲<code>onMeasureåQˆï¼‰</code>æ–ÒŽ(gu¨©)³•来确定组件的ž®ºå¯¸åQˆæ³¨æ„ï¼š(x¨¬)在LabelView中是通过一个私有函æ•?code>measureWidth()</code>来实现的åQ?</li> <li>重蝲<code>onDraw()</code>函数把Lable昄¡¤ºåœ¨æä¾›çš„canvas上ã€?</li> </ul> <p>在例子中åQŒä½ å¯ä»¥é€šè¿‡<a ><span style="color: #439740;">custom_view_1.xml</span></a>看到自定义组件LabelView的用法。在XMLæ–‡äšg中特别要注意的是<code>androidåQ?/code>å’?code>app:</code>ä¸¤ä¸ªå‚æ•°çš„æØœåˆè¿ç”¨ï¼Œ<code>appåQ?/code>参数表示应用½E‹åºä¸­è¢«è®¤äØ“(f¨´)是LabelView¾l„äšg的个体,˜q™äº›ä¹Ÿä¼š(x¨¬)ä½œäØ“(f¨´)资源在R¾cÖM¸­å®šä¹‰ã€?/p> <p><a></a></p> <h2>¾l„äšg混合技术Compound Components (or Compound Controls) </h2> <p align="left">如果你不惛_ˆ›å»ÞZ¸€ä¸ªå®Œå…¨è‡ªå®šä¹‰çš„组ä»Óž¼Œè€Œæ˜¯ç”±å‡ ä¸ªçŽ°æœ‰ç»„ä»¶çš„¾l„合产生的新的组ä»Óž¼Œé‚£ä¹ˆæ··åˆ¾l„äšg技术就更加适合。简单的æ? è¯ß_(d¨¢)¼Œ˜q™æ ·æŠŠå‡ ä¸ªçŽ°æœ‰çš„¾l„äšg融合åˆîC¸€ä¸ªé€»è¾‘¾l„合里面可以ž®è£…成一个新的组件。例如,一个Combo Box¾l„äšg可以看作是是一个EditText和一个带有弹出列表的Button¾l„äšgçš„æØœåˆä½“ã€‚å¦‚æžœä½ ç‚¹å‡»æŒ‰é’®ä¸ºåˆ—è¡¨é€‰æ‹©ä¸€™å¹ï¼Œ </p> <p>在Android中,其实˜q˜æœ‰å…¶ä»–的两个View¾cÕd¯ä»¥åšåˆ°ç±»ä¼¼çš„æ•ˆæžœåQ?<a ><span style="color: #439740;">Spinner</span></a>å’?a ><span style="color: #439740;">AutoCompleteTextView</span></a>,åQŒä½†æ˜¯Combo Boxä½œäØ“(f¨´)一个例子更å®ÒŽ(gu¨©)˜“让äh理解ã€?</p> <p>下面½Ž€å•的介绍如何创徏¾l„合¾l„äšgåQ?/p> <ol> <li>一般从Layout¾cÕd¼€å§‹ï¼Œåˆ›å¾ä¸€ä¸ªLayout¾cȝš„‹z„¡”Ÿ¾c…R€‚也许在Combo box我们ä¼?x¨¬)选择水åã^方向的LinearLayoutä½œäØ“(f¨´)父类。记住,其他的Layout¾cÀL˜¯å¯ä»¥åµŒå¥—到里面的åQŒå› æ­¤æØœåˆç»„件可以是ä»ÖM½•¾l„äšgçš„æØœåˆã€‚æ³¨ 意,正如Activityä¸€æ øP¼Œä½ æ—¢å¯ä»¥ä½¿ç”¨å¤–部XMLæ–‡äšg来声明你的组ä»Óž¼Œä¹Ÿå¯ä»¥åµŒå¥—在代码中ã€?</li> <li>åœ¨æ–°çš„æØœåˆç»„ä»¶çš„æž„é€ å‡½æ•îC¸­åQŒé¦–先,调用所有的父类的构造函敎ͼŒä¼ å…¥å¯¹åº”的参数。然后可以设¾|®ä½ çš„æØœåˆç»„件的其他的一些方面,在哪创徏 EditText¾l„äšgåQŒåˆåœ¨å“ªåˆ›å¾PopupList¾l„äšg。注意:(x¨¬)你同时也可以在XMLæ–‡äšg中引入一些自å·Þqš„属性和参数åQŒè¿™äº›å±žæ€§å’Œå‚数也可以被你的混合 ¾l„äšg所使用ã€?</li> <li>你也可以创徏旉™—´ç›‘听器去监听新组件中View¾c»è§¦å‘的事äšgåQŒä¾‹å¦‚,对List选项单击事äšg的监听,你必™åÕdœ¨æ­¤æ—¶é—´å‘生后更新你EditText的倹{€?</li> <li>ä½ å¯èƒ½åˆ›å»ø™‡ªå·Þqš„一些属性,带有讉K—®å’Œä¿®æ”ÒŽ(gu¨©)–¹æ³•。例如,允许讄¡½®EditTextåˆå§‹å€¼åÆˆä¸”æä¾›è®¿é—®å®ƒçš„æ–¹æ³•ã€?</li> <li>在Layout的派生类中,你没有必要去重蝲<code>onDrawåQˆï¼‰</code>å’?code>onMeasureåQˆï¼‰</code>æ–ÒŽ(gu¨©)³•åQŒå› ä¸ºLayoutä¼?x¨¬)有比较好的默认处理。但是,如果你觉得有必要你也可以重蝲它ã€?</li> <li>你也可能重蝲一äº?code>on</code>¾pÕdˆ—函数åQŒä¾‹å¦‚通过<code>onKeyDown()</code>的重载,你可以通过按某个键去选择列表中的对应的倹{€?</li> </ol> <p>æ€ÖM¹‹åQŒæŠŠLayout¾cÖM½œä¸ºåŸº¾cÀLœ‰ä¸‹é¢å‡ ä¸ªä¼˜ç‚¹åQ?/p> <ul> <li>正如activityä¸€æ øP¼Œä½ ä¹Ÿå¯ä»¥é€šè¿‡XMLæ–‡äšgåŽÕd£°æ˜Žä½ çš„æ–°¾l„äšgåQŒæˆ–者你也可以在代码中嵌套ã€?</li> <li><code>onDrawåQˆï¼‰</code>函数å’?code>onMeasure()</code>函数是没有必要重载的åQŒä¸¤ä¸ªå‡½æ•°å·²¾låšå¾—很好了ã€?</li> <li>你可以很快的创徏你的混合¾l„äšgåQŒåƈ且可以像单一¾l„äšg那样使用ã€?</li> </ul> <h4>混合¾l„äšg的例子(Examples of Compound ControlsåQ?/h4> <p>In the API Demos project 在API Demos工程中,有两个List¾cȝš„例子——Example 4å’ŒExample 6åQŒé‡Œé¢çš„SpeechView¾l„äšg是从LinearLayout¾cÀL´¾ç”Ÿè¿‡æ¥ï¼Œå®žçŽ°æ˜„¡¤ºæ¼”讲昄¡¤ºåŠŸèƒ½åQŒå¯¹åº”的原代码是<code>List4.java</code>å’?code>List6.java</code>ã€?/p> <p><a></a></p> <h2>调整现有¾l„äšgåQˆTweaking an Existing ComponentåQ?</h2> <p>在某些情况下åQŒä½ å¯èƒ½æœ‰æ›´½Ž€å•çš„æ–ÒŽ(gu¨©)³•åŽÕdˆ›å»ÞZ½ çš„组件。如果你应经有了一个非常类似的¾l„äšgåQŒä½ æ‰€è¦åšçš„只是简单的从这个组件派生出你的¾l„äšgåQŒé‡åœ¨å…¶ä¸? 一些有必要修改的方法。通过完全自定义组件的æ–ÒŽ(gu¨©)³•你也可以同样的实玎ͼŒä½†é€šè¿‡å†²View‹z„¡”Ÿäº§ç”Ÿæ–°çš„¾l„äšgåQŒä½ å¯ä»¥½Ž€å•获取一些已¾lå­˜åœ¨çš„处理机制åQŒè¿™äº›å¾ˆ 可能是你所惌™¦çš„,而没有必要从头开始ã€?/p> <p>例如åQŒåœ¨SDK中有一个NotePad的例子(<a ><span style="color: #439740;">NotePad application</span></a> åQ‰ã€‚该例子演示了很多Androidòq›_°å®žç”¨çš„细节,例如你会(x¨¬)学到从EditView‹z„¡”Ÿå‡ø™ƒ½å¤Ÿè‡ªåŠ¨æ¢è¡Œçš„è®îCº‹æœ¬ã€‚è¿™˜q˜ä¸æ˜¯ä¸€ä¸ªå®Œ¾ŸŽçš„例子åQŒå› ä¸ºç›¸æ¯”早期的版本来说åQŒè¿™äº›API已经感变了很多,但它¼‹®å®žè¯´æ˜Žäº†ä¸€äº›é—®é¢˜ã€?/p> <p>如果你还未查看该½E‹åºåQŒçŽ°åœ¨ä½ ž®±å¯ä»¥åœ¨Eclipse中导入记事本例程åQˆæˆ–仅通过提供的链接查看相应的源代码)。特别是查看<a ><span style="color: #439740;">NoteEditor.java</span></a> 中的<code>MyEditText</code>的定义ã€?/p> <p>下面有几点要注意的地方:(x¨¬)</p> <ol> <li><strong>声明åQˆThe DefinitionåQ?/strong> <p>˜q™ä¸ª¾cÀL˜¯é€šè¿‡ä¸‹é¢ä¸€è¡Œä»£ç æ¥å®šä¹‰çš„:(x¨¬)</p> <code>public static class MyEditText extends EditText</code><br /> <br /> <ul> <li>它是定义åœ?code>NoteEditor activity</code>¾c»é‡Œé¢çš„åQŒä½†æ˜¯å®ƒæ˜¯å…±æœ‰çš„åQˆpublicåQ‰ï¼Œå› æ­¤å¦‚果有必要,它可以通过<code>NoteEditor.MyEditText</code>ä»?code>NoteEditor</code>外面来调用ã€?</li> <li>它是<code>static</code>¾c»ï¼ˆé™æ€ç±»åQ‰ï¼Œæ„å‘³ç€ä¸ä¼š(x¨¬)出现所谓的通过父类讉K—®æ•°æ®çš?#8220;虚态方æ³?#8221;åQ?˜q™æ ·ž®×ƒ‹Éè¯¥ç±»æˆäØ“(f¨´)一个可以不严重依赖<code>NoteEditor</code>的单独类。对于不需要从外部¾c»è®¿é—®çš„内联¾cȝš„创徏åQŒè¿™æ˜¯ä¸€ä¸ªå¾ˆæ¸…晰地思èµ\åQŒä¿è¯æ‰€äº§ç”Ÿçš„类很小åQŒåƈ且允许它可以被其他的¾cÀL–¹ä¾¿çš„调用ã€?</li> <li>它是<code>EditText</code>¾cÈš„æ‰©å±•åQŒå®ƒæ˜¯æˆ‘们选择的用来自定义的父¾c…R€‚当我们完成以后åQŒæ–°çš„ç±»ž®±å¯ä»¥ä½œä¸ÞZ¸€ä¸ªæ™®é€šçš„<code>EditText</code>来ä‹É用ã€?br /> </li> </ul> </li> <li><strong>¾cȝš„初始åŒ?/strong> <p>一般来è¯ß_(d¨¢)¼Œçˆ¶ç±»æ˜¯é¦–先调用的。进一步来è¯ß_(d¨¢)¼Œ˜q™ä¸æ˜¯ä¸€ä¸ªé»˜è®¤çš„æž„造函敎ͼŒè€Œæ˜¯ä¸€ä¸ªå¸¦å‚数的构造函数。因ä¸?code>EditText</code>是ä‹É用从XML布局文äšg提取出来的参数进行创建,因此我们的构造函æ•îC¹Ÿè¦å–å‡ºå‚æ•°åÆˆä¸”å°†˜q™äº›å‚数传递给父类ã€?/p> </li> <li><strong>æ–ÒŽ(gu¨©)³•重蝲</strong> <p>在本例中åQŒä»…å¯?code>onDraw()</code>一个方法进行重载。但你可以很å®ÒŽ(gu¨©)˜“åœîCØ“(f¨´)你的定制¾l„äšg重蝲其他需要的æ–ÒŽ(gu¨©)³•ã€?/p> <p>对于è®îCº‹æœ¬ä¾‹å­æ¥è¯ß_(d¨¢)¼Œé€šè¿‡é‡è²<code>onDraw()</code>æ–ÒŽ(gu¨©)³•我们可以åœ?code>EidtView</code>的画布(<code>canvas</code>åQ‰ä¸Š¾l˜åˆ¶è“è‰²çš„线条(<code>canvas</code>¾cÀL˜¯é€šè¿‡é‡å†™çš?code>onDraw()</code>æ–ÒŽ(gu¨©)³•传递)。该函数快要¾l“束时要调用<code>super.onDraw()</code>函数。父¾cÈš„æ–ÒŽ(gu¨©)³•是应该调用,但是在这个例子里面,我们是在我们划好了蓝¾U¿ä¹‹åŽè°ƒç”¨çš„ã€?/p> </li> <li><strong>使用定制¾l„äšg</strong> <p>现在åQŒæˆ‘们已¾læœ‰è‡ªå·±å®šåˆ¶çš„组件了åQŒä½†æ˜¯åº”该怎样使用它呢åQŸåœ¨è®îCº‹æœ¬ä¾‹å­ä¸­åQŒå®šåˆ¶çš„¾l„äšg直接在预定义的布局文äšg中ä‹É用,让我们看一çœ?code>res/layout</code>目录中的<code>note_editor.xmlæ–‡äšgã€?/code></p> <pre><view xmlns:android="http://schemas.android.com/apk/res/android" <br /> class="com.android.notepad.NoteEditor$MyEditText" <br /> id="@+id/note"<br /> android:layout_width="fill_parent"<br /> android:layout_height="fill_parent"<br /> android:background="@android:drawable/empty"<br /> android:padding="10dip"<br /> android:scrollbars="vertical"<br /> android:fadingEdge="vertical" /> </pre> <ul> <li>该自定义¾l„äšg在XMLä¸­æ˜¯ä½œäØ“(f¨´)一个一般的View¾cÀL¥åˆ›å¾çš„,òq¶ä¸”是通过全èµ\径包来描˜q°çš„。注意这里内联类是通过<code>NoteEditor$MyEditText</code>来表½Cºçš„åQŒè¿™æ˜¯Java¾~–程中引用内联类的标准方法ã€?</li> <li>在定义中的其他属性和参数ž®†ä¼ é€’给定制¾l„äšg的构造函敎ͼŒç„¶åŽæ‰ä¼ åˆ°EditText构造函æ•îC¸­åQŒå› æ­¤è¿™äº›å‚æ•îC¹Ÿæ˜¯ä½ ä½¿ç”¨EditText¾l„äšg的参数。注意,˜q™é‡Œä½ ä¹Ÿå¯ä»¥å¢žåŠ ä½ è‡ªå·Þqš„参数åQŒæˆ‘ä»¬å°†åœ¨ä¸‹é¢è®¨è®ø™¿™ä¸ªé—®é¢˜ã€?</li> </ul> </li> </ol> <p>˜q™å°±æ˜¯ä½ å…¨éƒ¨éœ€è¦åšçš„,诚然˜q™æ˜¯ä¸€ä¸ªç®€å•的例子。但问题的关键是åQšä½ çš„需求有多复杂,那么你的自定义组件就有多么复杂ã€?/p> <p>一个更为复杂的¾l„äšg可能需要重载更多的<code>on</code>¾pÕdˆ—函数åQŒåƈ且还要很多特有的函数来充分实现自定义¾l„äšg的功能。唯一的限制就是你的想象力和你需要组件去执行什么工作ã€?/p> <p><a></a></p> <h2>现在开始你的组件化之旅å?</h2> <p>如你所见,Android提供了一¿Uç²¾å·§è€Œåˆå¼ºå¤§çš„组件模型,让你ž®½å¯èƒ½çš„完成你的工作。从½Ž€å•çš„¾l„äšgè°ƒæ•´åˆ°ç»„ä»¶æØœåˆï¼Œç”šè‡³å®Œå…¨è‡ªå®šä¹‰ç»„ä»Óž¼Œç‰|´»çš„运用这些技术,你应该可以得åˆîC¸€ä¸ªå®Œå…¨ç¬¦åˆä½ å¤–观要求的的Android½E‹åº </p> <img src ="http://www.aygfsteel.com/caizh2009/aggbug/338757.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/caizh2009/" target="_blank">ž®èœæ¯›æ¯›</a> 2010-11-23 10:19 <a href="http://www.aygfsteel.com/caizh2009/archive/2010/11/23/338757.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>什么是android marketåQŸå›½å†…三大类android market知多ž®‘?http://www.aygfsteel.com/caizh2009/archive/2010/11/22/338717.htmlž®èœæ¯›æ¯›ž®èœæ¯›æ¯›Mon, 22 Nov 2010 09:41:00 GMThttp://www.aygfsteel.com/caizh2009/archive/2010/11/22/338717.htmlhttp://www.aygfsteel.com/caizh2009/comments/338717.htmlhttp://www.aygfsteel.com/caizh2009/archive/2010/11/22/338717.html#Feedback0http://www.aygfsteel.com/caizh2009/comments/commentRss/338717.htmlhttp://www.aygfsteel.com/caizh2009/services/trackbacks/338717.html

    APP虎大讲堂åQ?/strong>
    android marketž®±æ˜¯½E‹åºåº”用商店。在2008òq?æœ?9日,è°äh­ŒæŽ¨å‡ºäº†Android MarketåQŒäØ“(f¨´)使用Android操作¾pȝ»Ÿçš„æ‰‹æœºç”¨æˆähä¾›ç¬¬ä¸‰æ–¹åº”用ã€?/p>

    ˜q™ä¸ªòq›_°ç›æ€¼¼äºŽAppleçš?strong>App StoreåQŒå¯ä»¥è¿žæŽ¥æœ€æ–°çš„Google在线 服务器。由于其本土化的设计åQŒAndroid Market可以让用户下载和安装支持Android¾pȝ»Ÿçš„第三方软äšgã€?/p>

    Googleä½œäØ“(f¨´)Android Market的东道主åQŒå´ä¸€å†å¼ºè°ƒAndroid Market的扮演的角色仅仅æ˜?#8220;软äšg销售和传播的中å¿?/strong>”而不æ˜?#8220;软äšg˜q‡æ×o(h¨´)å™?#8221;ã€?/p>

    ä¸ÞZ»€ä¹ˆGoogle选择 android market 而不是StoreåQ?/h4>

    Google选择“’Market’”˜q™ä¸ªè¯è€Œä¸æ˜?#8220;Store”åQŒæ˜¯å› äØ“(f¨´)其觉得开发者需要的是一个开攄¡š„、毫无阻¼„çš„环境来创造内宏V€‚Google希望 Android Market最¾lˆä¼š(x¨¬)像YouTube那样åQŒåªéœ€è¦æ³¨å†Œä¸€ä¸ªå‘行äh资格和èÊYä»¶çš„¾cÕdˆ«ž®±å¯ä»¥å‘布èÊYä»¶ã€?br /> Googleòq¶æ²¡æœ‰è¡¨½CÞZ¼š(x¨¬)对android market˜q›è¡Œç›‘管åQŒåªæ˜¯è¡¨½CºAndroid Market里的软äšgž®†æ‹¥æœ‰åé¦ˆç³»¾lŸä»¥å?qi¨¢ng)类似YouTube上的½{‰çñ”¾pȝ»Ÿã€‚Google ž®†é€šè¿‡˜q½è¸ªå·¥å…·èŽ·å¾—è½¯äšg的反馈,如果某个软äšg有危险性,ž®†ä¼š(x¨¬)有标识提醒用æˆäh³¨æ„ã€‚但是其中的隐私问题却在前不久的SMobile 的分析报å‘?gt;中显露无疑,而且普通用户很难注意到有些软äšgä¼?x¨¬)äçR犯他们的隐私åQŒå†µä¸”让è°äh­Œandroid手机用户去èöL别生涩的专业名词åQŒå®žåœ¨å¤ªå¼ÞZh所难了ã€?/p>

    Android Market学习(f¨¤n)了App Store开创的软äšg销售模式,对iPhone以及(qi¨¢ng)App Store是一个冲击;更重要的一斚w¢æ˜?Google选择的Market模式与苹果的App Store之间的差异会(x¨¬)逐渐昄¡Ž°å‡ºæ¥ã€?/p>

    国内三大¾c»android market知多ž®?/h4>

    自从android在中国大大的火了一把之后,android market也如雨后春笋般的不断涌现出来。æ€Èš„来说android market有如下几¾c»ï¼š(x¨¬)
    ½W¬ä¸€¾c»ï¼š(x¨¬) è°äh­Œåˆ›å¾çš„android market
    è°äh­Œandroid marketåQŒåªæ­¤ä¸€å®Óž¼Œåˆ«æ— å…¶ä»–官方marketã€?/p>

    ½W¬äºŒ¾c»ï¼š(x¨¬) 国内有头有脸的手机厂商和¿UÕdЍ˜qè¥å•†åˆ›å»ºçš„android market

    • MOTO的智件园:
      摩托¾|—拉也是通过åŽÕd¹´è½¬åž‹ç”Ÿäñ”一¾pÕdˆ—android手机åQŒæ‰ç€å®žå¤§èµšäº†ä¸€æŠŠï¼Œ‹¹è{了不利局面,倒是Nokia˜qŸç¼“的反应速度让其市场份额半年几乎损失˜q? 半,虽然只在英国占有ä¸Õd¯¼åœîC½åQŒå¯ä»¥åœ¨¾ŸŽå›½çš„市åœÞZ†¾é¢è¿œä¸åŠ(qi¨¢ng)iphoneå’Œandroid手机åQŒMOTOçš„Milestone更是让其重新站上历史的舞 台。不甘于è¢?strong>è°äh­Œandroid marke
      t 控制的摩托罗拉自然在å¯Õd‡ºè·¯ï¼Œå»ºé€ è‡ªå·Þqš„android market
    • 中移动的Mobile Market
    • 中移动的MM½Ž€å•来说是在android1.0/android1.5的基¼‹€ä¸Šæ”¹è‰¯ç‰ˆçš„android¾pȝ»ŸåQŒè™½ç„¶å½“时可以跑动大部分android 软äšgåQŒä½†æ˜¯è¿™ä¸ªmarket仍处于不愠不火的状态。不˜q‡ä¸ä¹…前åQŒä¸­å›½ç§»åŠ¨åœ¨åŽŸæ¥ç‰ˆæœ¬çš„åŸº¼‹€ä¸Šè¿›è¡Œäº†è®¸å¤šåˆ›æ–°å’Œæ”¹˜q›ï¼ŒæŽ¨å‡ºçš„OPhone2,0åQŒè¿˜å®Œå…¨å…¼å®¹ Android2.1åQŒç”šè‡³ä¸‰æ˜?#8220;奥斯卡I7680”也搭载了OMS¾pȝ»Ÿã€‚目前MM已经初具规模åQŒä¸­å›½ç§»åЍMobile Market拥有16400‹Æ‘Öº”用ã€?/p>

    • 联通的UniStore
    • 联通应用商åº?UniStore)已经完成了æ˜Oé•¿çš„“内测阶段”åQŒå°†äº?月中旬正式发布,该应用商店在支付模式上将采用“中间账户”的模式,用户æ³? 册联通应用商店时ä¼?x¨¬)自动注å?#8220;中间账户”åQŒä¾¿å¯ç»‘定话è´ÒŽ(gu¨©)”¯ä»˜æˆ–者支付宝、胦付通等½W¬ä¸‰æ–ÒŽ(gu¨©)”¯ä»˜å·¥å…—÷€‚据æ‚(zh¨¨n)‰ï¼Œè”通应用商店将采用开攑Öã^台的模式åQŒä¹Ÿž®±æ˜¯è¯´ä¸ä»? 支持中国联通手机用户ä‹É用,也支持中国移动和中国ç”?sh¨´)信的手机用户ä‹É用,目前仅æœ?75‹Æ¾ã€?/p>

    • 中国ç”?sh¨´)信的天¾˜ÆDÊYä»¶å·¥åŽ?/strong>
    • 中国ç”?sh¨´)信的天¾˜¼ç©ºé—´æ›´æ˜¯æ—¶åˆÕd¤„在升¾U§çŠ¶æ€ï¼Œè™½ç„¶ä½¿å‡º‹¹‘èín解数åQŒä¹Ÿä»ç„¶éš¾è§èµ¯‚‰²åQŒå¤©¾˜¼ç©ºé—´æ‹¥æœ?054‹Æ?/p>

    • é…äh´¾çš„Android Coolmartä¸ÞZº†æ”¯æ’‘新机器的上市åQŒå®‡é¾™é…·‹z¾ä¹Ÿæ­£åœ¨˜q›è¡Œç€Android Coolmart的招兵买马中ã€?/li>

    ½W¬ä¸‰¾c»ï¼š(x¨¬) 独立½W¬ä¸‰æ–¹åˆ›å»ºçš„android market

    虽然可用的谷歌android市场­‘Šæ¥­‘Šå¤šåQŒä½†æ˜¯åŒè´¨åŒ–­‘Šæ¥­‘Šä¸¥é‡çš„Market只能让用æˆäh— æ‰€é€‚从åQŒä¹Ÿæ— æ³•产生¾cÖM¼¼App Store一æ ïL(f¨¥ng)š„用户黏性。怎么æ äh•™è‚²ç”¨æˆïL(f¨¥ng)”¨è‡ªå®¶çš„market是最大的问题åQŒè®©æˆ‘们期待中国的android市场是如何演¾lŽä»–们自å·Þqš„æ•…事。当然APP 虎的软äšg在各¾cÕd¸‚场都可以通过搜烦APPhu下蝲ã€?/p>

    ]]>PC上试玩Android Markethttp://www.aygfsteel.com/caizh2009/archive/2010/11/22/338713.htmlž®èœæ¯›æ¯›ž®èœæ¯›æ¯›Mon, 22 Nov 2010 08:56:00 GMThttp://www.aygfsteel.com/caizh2009/archive/2010/11/22/338713.htmlhttp://www.aygfsteel.com/caizh2009/comments/338713.htmlhttp://www.aygfsteel.com/caizh2009/archive/2010/11/22/338713.html#Feedback0http://www.aygfsteel.com/caizh2009/comments/commentRss/338713.htmlhttp://www.aygfsteel.com/caizh2009/services/trackbacks/338713.htmlhttp://www.iteeyan.com/2010/07/play-android-app-on-emulator/

    前几天,Jackeroo¾l™å¤§å®¶ä»‹¾läº†ä¸€ä¸ªAndroid模拟器,可以让大家在PCæœÞZ¸ŠçŽ©Android 2.2。不˜q‡ï¼Œè¯¥æ¨¡æ‹Ÿå™¨ä¸­å°‘了一个精华的东西åQŒé‚£ž®±æ˜¯“Android MarketåQˆç”µ(sh¨´)子市场)”。目前,iPhone手机玩的是操控感、时ž®šï¼Œè€ŒAndroid手机玩的则是软äšgåQŒå°‘äº?#8220;Android Market”çš„Android模拟器,无异于自废了一半的功力……

    其实åQŒè¦æƒ›_œ¨Android 2.2模拟器中使用“Android MarketåQˆç”µ(sh¨´)子市场)”åQŒè®¤çœŸè¯´æ¥è¿˜æ˜¯æœ‰ç‚šwº»çƒ¦ã€‚网上虽然也有地方介¾lè¿‡åQŒä½†å¾ˆå¤š¾l†èŠ‚éƒ¨åˆ†è¯­ç„‰ä¸è¯¦ã€‚Jackeroož®×ƒ»¥è‡ªå·±çš„实战操作,帮助大家温习(f¨¤n)一下ã€?/p>

    Step 01 新徏Android 2.2虚拟�/strong>

    首先åQŒå®‰è£…Android SDKåQŒæ–°å»ÞZ¸€å°Android 2.2虚拟机。不知道该去哪里下蝲Android SDK或者不清楚该如何ä‹É用虚拟机的朋友,请先阅读“Google手机免费çŽ?#183;在PC上装Android 2.2”博文ã€?/p>

    PlayAndroidAppOnEmulator 01 393x500 PC上试玩Android Market

    Step 02 命ä×o(h¨´)è¡Œæ–¹å¼å¯åŠ¨æ–°å»ø™™šæ‹Ÿæœº

    把SDK包下的System.imgæ–‡äšgåQˆF(tu¨¢n):\android-sdk-windows\platforms\android-8\imagesåQ‰æ‹·è´åˆ°çš?UserProfile%\.android\avd\Android-2.2下ã€?/p>

    然后打开命ä×o(h¨´)行窗口,切换到SDK包的Tools目录下,加参æ•?#8220;-partition-size 96”启动虚拟机,才能è®?system有èƒö够的½Iºé—´å®‰è£…“Android MarketåQˆç”µ(sh¨´)子市场)”ã€?/p>

    cd /d f:\android-sdk-windows\tools

    emulator.exe -avd Android-2.2 -partition-size 96

    PlayAndroidAppOnEmulator 02 500x326 PC上试玩Android Market

    Step 03 让Android启动Checkin服务

    è¦æ­£å¸æ€‹Éç”?#8220;Android MarketåQˆç”µ(sh¨´)子市场)”åQŒå¿…™åÕd¯åЍCheckin服务。等Android 2.2虚拟机启动完毕,看到正常的界面ã€?/p>

    PlayAndroidAppOnEmulator 03 500x354 PC上试玩Android Market

    ˜q™æ—¶å€™ï¼Œæˆ‘们可以把配¾|®æ–‡ä»¶build.prop取回来编辑(如果你有真实的Android˜qžåœ¨ç”?sh¨´)脑上,一定要先取下来再进行以下操作)ã€?/p>

    cd /d f:\android-sdk-windows\tools

    adb pull /system/build.prop .

    PlayAndroidAppOnEmulator 04 500x326 PC上试玩Android Market

    注意åQšç¬¬ä¸€‹Æ¡æ‰§è¡Œadb指ä×o(h¨´)åQŒä¼š(x¨¬)加蝲adb相关服务åQŒç„¶åŽæ½C?#8220;device offlineåQˆè®¾å¤‡ä¸åœ¨çº¿åQ?#8221;。此æ—Óž¼Œéœ€è¦å†‹Æ¡æ‰§è¡Œä¸Šé¢çš„adb指ä×o(h¨´)ž®±å¯ä»¥äº†ã€?/span>

    ˜q™æ ·ä¸€æ¥ï¼Œbuild.propž®±æ”¾åœ¨äº†f:\android-sdk-windows\tools目录下,用文本编辑èÊY件比如EmEditor、UltraEdit之类的打开它。将“ro.config.nocheckin=yes”前面åŠ?#8220;#”åäh³¨é‡ŠæŽ‰ã€?/p>

    #ro.config.nocheckin=yes

    然后再传到Android虚拟æœÞZ¸ŠåQŒé‡æ–°å¯åŠ¨è™šæ‹ŸæœºåQŒCheckin服务ž®±å¯åŠ¨äº†åQˆåœ¨ä¸Šä¼ ä¹‹å‰åQŒéœ€è¦æ‰§è¡?#8220;adb remount”指ä×o(h¨´)ä½?system目录可写åQ‰ã€?/p>

    adb remount
    adb push build.prop /system/build.prop

    PlayAndroidAppOnEmulator 05 500x326 PC上试玩Android Market

    Step 04 安装“Android  Market”到虚拟机

    首先åQŒä¸‹è½½ä¸€ä¸ªäØ“(f¨´)各种手机开发的定制版Android 2.2åQŒæ¯”如Jackeroo曄¡»ç”¨è¿‡çš„Android 2.2 for HTC。将它解压羃åQŒå°†system/app/GoogleServicesFramework.apk å’Œsystem/app/Vending.apk攑ֈ°f:\android-sdk-windows\tools下ã€?/p>

    Android 2.2 for Legend åQ?a target="_blank">˜qœç¨‹ä¸‹è²

    然后执行以下指ä×o(h¨´)安装˜q™ä¸¤ä¸ªapk安装包,òq¶ä¸”删除Android虚拟æœÞZ¸Šçš„SdkSetup.apkåQˆæ³¨æ„å¤§ž®å†™åQ‰ï¼š(x¨¬)

    adb push GoogleServicesFramework.apk /system/app
    adb push Vending.apk /system/app
    adb shell rm /system/app/SdkSetup.apk

    PlayAndroidAppOnEmulator 06 500x326 PC上试玩Android Market

    Step 05 清理现场

    关闭虚拟æœ? 把äñ”生的 image: userdata-qemu.img, userdata.img, cache.img都删除,重新启动虚拟机它?y¨­u)®×ƒ¼?x¨¬)自动初始化ã€?/p>

    Step 06 “Android Market”现èín

    打开SDK Setup.exeåQŒæŒ‰ç…§å¸¸è§„方式启动刚才新创徏的Android 2.2虚拟机,ž®±å¯ä»¥çœ‹åˆ?#8220;Android Market”ã€?/p>

    PlayAndroidAppOnEmulator 07 500x354 PC上试玩Android Market

    点击“Market”åQŒå°±éœ€è¦è¿›è¡ŒGoogleç™Õd½•了,用你自己的Google账号ç™Õd½•吧ã€?/p>

    PlayAndroidAppOnEmulator 08 500x354 PC上试玩Android Market

    ç™Õd½•以后åQŒç†è®ÞZ¸Šè¯´å°±å¯ä»¥ä½¿ç”¨“Android MarketåQˆç”µ(sh¨´)子市场)”ž®è¯•各种软äšg了,但由于网¾lœæ— æ³•连接,暂时˜q˜æœç´¢ä¸åˆ°ã€?/p>

    有连接上的朋友,请告诉我解决æ–ÒŽ(gu¨©)³•ã€?nbsp;



    ]]>
    通过AIDLå?qi¨¢ng)反ž®„机å?使用隐藏API挂断ç”?sh¨´)è¯?转蝲)http://www.aygfsteel.com/caizh2009/archive/2010/11/22/338708.htmlž®èœæ¯›æ¯›ž®èœæ¯›æ¯›Mon, 22 Nov 2010 08:11:00 GMThttp://www.aygfsteel.com/caizh2009/archive/2010/11/22/338708.htmlhttp://www.aygfsteel.com/caizh2009/comments/338708.htmlhttp://www.aygfsteel.com/caizh2009/archive/2010/11/22/338708.html#Feedback0http://www.aygfsteel.com/caizh2009/comments/commentRss/338708.htmlhttp://www.aygfsteel.com/caizh2009/services/trackbacks/338708.htmlhttp://dev.10086.cn/cmdn/bbs/thread-17136-1-1.html

    最˜q‘看论坛上有人问如何挂断ç”?sh¨´)è¯?实际ä¸?.1版本å?Google已经把该API隐藏æŽ?br /> 今天看资æ–?发现可以通过AIDL(Android˜qœç¨‹æ–ÒŽ(gu¨©)³•)å?qi¨¢ng)反ž?调用hide API,废话不多说了.附上˜q‡ç¨‹

    一:在你的项目中新徏包com.android.internal.telephony,因䨓(f¨´)要ä‹É用AIDL,该包与ITelephony.aidl一è‡?br />     在该包下新徏文äšgITelephony.aidl

    首先

    package com.android.internal.telephony;
    /* * Copyright (C) 2007 The Android Open Source Project
    * * Licensed under the Apache License, Version 2.0 (the "License");
    * you may not use this file except in compliance with the License.
    * You may obtain a copy of the License at
    * * [url=http://www.apache.org/licenses/LICENSE-2.0]http://www.apache.org/licenses/LICENSE-2.0[/url]
    * * Unless required by applicable law or agreed to in writing, software
    * distributed under the License is distributed on an "AS IS" BASIS,
    * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    * See the License for the specific language governing permissions and
    * limitations under the License.
    */
    /**
    * Interface used to interact with the phone. Mostly this is used by the
    * TelephonyManager class. A few places are still using this directly.
    * Please clean them up if possible and use TelephonyManager insteadl.
    * * {@hide}
    */
    interface ITelephony {
    /** * End call or go to the Home screen *
    * @return whether it hung up
    */
    boolean endCall();
    /** * Answer the currently-ringing call.
    * * If there's already a current active call, that call will be
    * automatically put on hold. If both lines are currently in use, the
    * current active call will be ended. *
    * TODO: provide a flag to let the caller specify what policy to use
    * if both lines are in use. (The current behavior is hardwired to
    * "answer incoming, end ongoing", which is how the CALL button
    * is specced to behave.) *
    * TODO: this should be a oneway call (especially since it's called
    * directly from the key queue thread). */
    void answerRingingCall();
    }   
     
    之后ä¼?x¨¬)在gen下面自动生成ITelephony.java
    �通过反射生成ITelephony实例
    TelephonyManager telMgr = (TelephonyManager)getSystemService(
    TELEPHONY_SERVICE);
    //初始化iTelephony
    Class <TelephonyManager> c = TelephonyManager.class;
    Method getITelephonyMethod = null;
    try {
           getITelephonyMethod = c.getDeclaredMethod("getITelephony", (Class[])null);
           getITelephonyMethod.setAccessible(true);
    } catch (SecurityException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (NoSuchMethodException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    try {
            iTelephony = (ITelephony) getITelephonyMethod.invoke(telMgr, (Object[])null);
    } catch (IllegalArgumentException e) {
    // TODO Auto-generated catch block
          e.printStackTrace();
    } catch (IllegalAccessException e) {
    // TODO Auto-generated catch block
          e.printStackTrace();
    } catch (InvocationTargetException e) {
    // TODO Auto-generated catch block
          e.printStackTrace();
    }
    ˜q™æ ·å¯ä»¥è°ƒç”¨iTelephonyçš„endCall()æ–ÒŽ(gu¨©)³•
    ä¸?在AndroidManifest.xml中增加权é™?br />   <uses-permission android:name="android.permission.CALL_PHONE"/>


    ]]>
    Android 核心分析 之六 -----IPC框架分析 BinderåQŒServiceåQŒService manager http://www.aygfsteel.com/caizh2009/archive/2010/11/21/338630.htmlž®èœæ¯›æ¯›ž®èœæ¯›æ¯›Sun, 21 Nov 2010 13:13:00 GMThttp://www.aygfsteel.com/caizh2009/archive/2010/11/21/338630.htmlhttp://www.aygfsteel.com/caizh2009/comments/338630.htmlhttp://www.aygfsteel.com/caizh2009/archive/2010/11/21/338630.html#Feedback0http://www.aygfsteel.com/caizh2009/comments/commentRss/338630.htmlhttp://www.aygfsteel.com/caizh2009/services/trackbacks/338630.html阅读全文

    ]]>
    建立AIDL服务的步骤(3åQ?/title><link>http://www.aygfsteel.com/caizh2009/archive/2010/11/19/338491.html</link><dc:creator>ž®èœæ¯›æ¯›</dc:creator><author>ž®èœæ¯›æ¯›</author><pubDate>Fri, 19 Nov 2010 09:09:00 GMT</pubDate><guid>http://www.aygfsteel.com/caizh2009/archive/2010/11/19/338491.html</guid><wfw:comment>http://www.aygfsteel.com/caizh2009/comments/338491.html</wfw:comment><comments>http://www.aygfsteel.com/caizh2009/archive/2010/11/19/338491.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/caizh2009/comments/commentRss/338491.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/caizh2009/services/trackbacks/338491.html</trackback:ping><description><![CDATA[     摘要: 建立AIDL服务的步骤(3åQ?åQ?åQ‰ç¼–写一个MyService¾c»ï¼Œä»£ç å¦‚下åQ? package net.blogjava.mobile.complex.type.aidl;     import java.util.HashMap;   import java.util.Map; &nb...  <a href='http://www.aygfsteel.com/caizh2009/archive/2010/11/19/338491.html'>阅读全文</a><img src ="http://www.aygfsteel.com/caizh2009/aggbug/338491.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/caizh2009/" target="_blank">ž®èœæ¯›æ¯›</a> 2010-11-19 17:09 <a href="http://www.aygfsteel.com/caizh2009/archive/2010/11/19/338491.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>8.4.2 建立AIDL服务的步骤(2åQ?/title><link>http://www.aygfsteel.com/caizh2009/archive/2010/11/19/338490.html</link><dc:creator>ž®èœæ¯›æ¯›</dc:creator><author>ž®èœæ¯›æ¯›</author><pubDate>Fri, 19 Nov 2010 08:58:00 GMT</pubDate><guid>http://www.aygfsteel.com/caizh2009/archive/2010/11/19/338490.html</guid><wfw:comment>http://www.aygfsteel.com/caizh2009/comments/338490.html</wfw:comment><comments>http://www.aygfsteel.com/caizh2009/archive/2010/11/19/338490.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/caizh2009/comments/commentRss/338490.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/caizh2009/services/trackbacks/338490.html</trackback:ping><description><![CDATA[     摘要: 8.4.2  建立AIDL服务的步骤(2åQ?在编写上面代码时应注意如下两点:(x¨¬) 使用bindServiceæ–ÒŽ(gu¨©)³•来绑定AIDL服务。其中需要ä‹É用Intent对象指定AIDL服务的IDåQŒä¹Ÿž®±æ˜¯<action>标签中android:name属性的倹{€?在绑定时需要一个ServiceConnection对象。创建ServiceConnection对象的过½E‹ä¸­å¦‚æžœ¾l‘定成功åQŒç³»¾lŸä¼š(x¨¬)è°?..  <a href='http://www.aygfsteel.com/caizh2009/archive/2010/11/19/338490.html'>阅读全文</a><img src ="http://www.aygfsteel.com/caizh2009/aggbug/338490.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/caizh2009/" target="_blank">ž®èœæ¯›æ¯›</a> 2010-11-19 16:58 <a href="http://www.aygfsteel.com/caizh2009/archive/2010/11/19/338490.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>建立AIDL服务的步骤(1åQ?/title><link>http://www.aygfsteel.com/caizh2009/archive/2010/11/19/338489.html</link><dc:creator>ž®èœæ¯›æ¯›</dc:creator><author>ž®èœæ¯›æ¯›</author><pubDate>Fri, 19 Nov 2010 08:56:00 GMT</pubDate><guid>http://www.aygfsteel.com/caizh2009/archive/2010/11/19/338489.html</guid><wfw:comment>http://www.aygfsteel.com/caizh2009/comments/338489.html</wfw:comment><comments>http://www.aygfsteel.com/caizh2009/archive/2010/11/19/338489.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/caizh2009/comments/commentRss/338489.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/caizh2009/services/trackbacks/338489.html</trackback:ping><description><![CDATA[     摘要: http://book.51cto.com/art/201006/207070.htm 建立AIDL服务的步骤(1åQ?建立AIDL服务要比建立普通的服务复杂一些,具体步骤如下åQ?åQ?åQ‰åœ¨Eclipse Android工程的Java包目录中建立一个扩展名为aidl的文件。该文äšg的语法类ä¼égºŽJava代码åQŒä½†ä¼?x¨¬)稍有不同。详¾l†ä»‹¾lè§å®žä¾‹52的内宏V€?åQ?åQ‰å¦‚æžœaidlæ–‡äšg的内å®ÒŽ(gu¨©)˜¯æ­£ç¡®çš„,ADT...  <a href='http://www.aygfsteel.com/caizh2009/archive/2010/11/19/338489.html'>阅读全文</a><img src ="http://www.aygfsteel.com/caizh2009/aggbug/338489.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/caizh2009/" target="_blank">ž®èœæ¯›æ¯›</a> 2010-11-19 16:56 <a href="http://www.aygfsteel.com/caizh2009/archive/2010/11/19/338489.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>android aidl 实例http://www.aygfsteel.com/caizh2009/archive/2010/11/19/338481.htmlž®èœæ¯›æ¯›ž®èœæ¯›æ¯›Fri, 19 Nov 2010 07:41:00 GMThttp://www.aygfsteel.com/caizh2009/archive/2010/11/19/338481.htmlhttp://www.aygfsteel.com/caizh2009/comments/338481.htmlhttp://www.aygfsteel.com/caizh2009/archive/2010/11/19/338481.html#Feedback0http://www.aygfsteel.com/caizh2009/comments/commentRss/338481.htmlhttp://www.aygfsteel.com/caizh2009/services/trackbacks/338481.html阅读全文

    ]]>
    俺拽汉化从未如此½Ž€å?APKTool使用教材http://www.aygfsteel.com/caizh2009/archive/2010/11/19/338448.htmlž®èœæ¯›æ¯›ž®èœæ¯›æ¯›Fri, 19 Nov 2010 01:51:00 GMThttp://www.aygfsteel.com/caizh2009/archive/2010/11/19/338448.htmlhttp://www.aygfsteel.com/caizh2009/comments/338448.htmlhttp://www.aygfsteel.com/caizh2009/archive/2010/11/19/338448.html#Feedback0http://www.aygfsteel.com/caizh2009/comments/commentRss/338448.htmlhttp://www.aygfsteel.com/caizh2009/services/trackbacks/338448.html

    在有APKTool之前åQŒAndroid软äšg的汉化是一仉™žå¸¸ç—›è‹¦çš„事情。例如汉化狂人的汉化工具åQŒé‚£éƒ½æ˜¯ç›´æŽ¥ä¿®æ”¹äºŒè¿›åˆ¶æ–‡ä»¶çš„åQŒé¦–å…? 是寻æ‰ùNœ€è¦ä¿®æ”¹çš„字符串苦难(当然汉化狂äh已经做得不错了)åQŒç„¶åŽä¿®æ”¹çš„字符串长度还要注意中文长度不能长˜q‡åŽŸæ¥çš„æ–‡å­—……个中郁闷ž®×ƒ¸¾l†è¯´äº†ã€?/p>

    APKTool可以说是一个革命性的工具åQŒæœ‰äº†APKTool之后åQŒå¯ä»¥è¯´åQŒä¿ºæ‹½èÊY件的汉化工作åˆîCº†ä¸€ä¸ªå‰æ‰€æœªæœ‰çš„简单程度ã€?br /> 闲话不说åQŒæˆ‘们用汉化实例来证明APKTool的方便简单,在动手之前,需要去 APKTool 的网站把工具下蝲下来。当然也可以下蝲我已¾læ‰“包的 APKTool.zip(Windows下ä‹Éç”?ã€?/p>

    ¼‹®ä¿ä½ çš„ç”?sh¨´)脑已经安装了JDK1.6åQˆJRE1.6也可以)åQŒè€Œä¸”安装了一个优¿U€çš„编辑èÊYä»Óž¼ˆæŽ¨èUltraEditåQ‰ï¼ŒæŠŠAPKToolè§£åŽ‹åˆ°éšä¾¿å“ªä¸ªä½ è®¤äØ“(f¨´)操作èµäh¥æ–¹ä¾¿çš„目录。如果都好了åQŒæˆ‘们动手吧åQ?/p>

    ½W¬ä¸€æ­¥ï¼ŒæŠŠéœ€è¦æ±‰åŒ–的文äšgåQˆä»¥æ±‰åŒ–ColorNoteä¸ÞZ¾‹åQ‰æ”¾åˆ°APKTool所在目录,然后命ä×o(h¨´)行进入APKTool目录åQŒæ‰§è¡Œä¸‹é¢çš„命ä×o(h¨´)åQ?/p>

    apktool  d  ColorNote.apk  ColorNote

    ˜q™å¥å‘½ä×o(h¨´)的意思是åQŒå¯¹ColorNote.apk˜q™ä¸ª½E‹åº˜q›è¡Œåç¼–译,获得的文件放在当前目录下的ColorNote目录中。正常反¾~–译的话åQŒèƒ½çœ‹åˆ°ä¸‹é¢çš„æ½Cºï¼š(x¨¬)

    I: Baksmaling…
    I: Decoding resource table…
    I: Decoding resources…
    I: Copying assets and libs…

    反编译完成,ä¼?x¨¬)在APKTool的目录下面,出现一个名叫ColorNote的目录,˜q›åŽ»çœ‹çœ‹åQŒæ˜¯˜q™ä¸ªæ ·å­çš„!

    用UltraEdit打开˜q™ä¸ªAndroidManifest.xml看看åQŸå“ˆå“ˆï¼Œæ˜¯çº¯æ–‡æœ¬æ–‡äšgå‘€åQåœ¨æ‰“å¼€res目录中的values中随便一个文 件看看?也是¾U¯æ–‡æœ¬æ–‡ä»¶å•ŠåQä¹Ÿž®±æ˜¯è¯ß_(d¨¢)¼Œåªè¦ä¸€ä¸ªUltraEditåQŒæˆ‘们就可以轻轻松松˜q›è¡Œæ±‰åŒ–了(ž®±æŠŠéœ€è¦çš„字符串è{换成中文ž®±å¯ä»¥äº†åQŒä¹Ÿä¸ç”¨è€ƒè™‘长度 了!åQ‰è‡³äºŽè¦æ±‰åŒ–哪些内容åQŒè¿™ä¸ªå¤§å®¶è‡ªå·Þq ”½I¶å§åQŒä¸ç”¨æˆ‘详细è¯ß_(d¨¢)¼Œä¹Ÿæ²¡æœ‰åŠžæ³•è¯¦¾l†è¯´çš„吧åQŸï¼ˆäº‹å®žä¸Šï¼Œé™¤äº†XML的文本资源文件外åQŒè€å¤–写的很多½E‹åºåQŒå­—½W¦ä¸² 都是hard coding在执行代码里面的åQŒAPKTool反编译会(x¨¬)得到smali伪代码,有些在XML资源里面找不到的字符ä¸ÔŒ¼ŒåŽÈœ‹çœ‹smali的代码吧。)

    中间的翻译过½E‹æˆ‘们蟩˜q‡åŽ»åQŒä¾‹å¦‚我们已¾lç¿»è¯‘好了,ž®±åœ¨APKTool目录下执行下面的命ä×o(h¨´)行:(x¨¬)

    apktool b ColorNote

    ˜q™æ¡å‘½ä×o(h¨´)是告诉APKToolåQŒæŠŠ˜q™ä¸ªColorNote目录里的东西¾~–译打包成APK½E‹åº

    I: Checking whether sources has changed…

    I: Smaling…

    I: Checking whether resources has changed…

    I: Building resources…

    I: Building apk file…

    生成的APK½E‹åºåœ¨å“ªé‡Œå‘¢åQŸåœ¨ColorNote\Dist目录里面åQŒåå­—是out.apk

    我们把这个out.apkæ–‡äšg½{‘֐ä¹‹åŽå®‰è£…看看åQŸå“ˆå“ˆï¼å®Œç¾Žä¸­æ–‡æ±‰åŒ–的俺拽程序来了!(当然åQŒè¿™è¦çœ‹æ±‰åŒ–者的功力了。)

    Popularity: 76%



    ]]>
    Android Activityå’ŒIntent机制学习(f¨¤n)½W”è®°http://www.aygfsteel.com/caizh2009/archive/2010/11/15/338089.htmlž®èœæ¯›æ¯›ž®èœæ¯›æ¯›Mon, 15 Nov 2010 06:13:00 GMThttp://www.aygfsteel.com/caizh2009/archive/2010/11/15/338089.htmlhttp://www.aygfsteel.com/caizh2009/comments/338089.htmlhttp://www.aygfsteel.com/caizh2009/archive/2010/11/15/338089.html#Feedback0http://www.aygfsteel.com/caizh2009/comments/commentRss/338089.htmlhttp://www.aygfsteel.com/caizh2009/services/trackbacks/338089.html阅读全文

    ]]>
    android 参考别人的UI设计http://www.aygfsteel.com/caizh2009/archive/2010/11/15/338081.htmlž®èœæ¯›æ¯›ž®èœæ¯›æ¯›Mon, 15 Nov 2010 05:31:00 GMThttp://www.aygfsteel.com/caizh2009/archive/2010/11/15/338081.htmlhttp://www.aygfsteel.com/caizh2009/comments/338081.htmlhttp://www.aygfsteel.com/caizh2009/archive/2010/11/15/338081.html#Feedback1http://www.aygfsteel.com/caizh2009/comments/commentRss/338081.htmlhttp://www.aygfsteel.com/caizh2009/services/trackbacks/338081.html 在没有遇到这个工具前 我是通过破解别äh的程序去查看他的设计的ã€?
    那天无意中在 tools˜q™ä¸ªæ–‡äšg夹下发现˜q™ä¸ªæ–‡äšg hierarchyviewer.batåQŒGoogle一下发现帮你分析应用程序UI布局ã€?
    现在我们开始ä‹É用它吧:(x¨¬)
    ½W¬ä¸€æ­¥ï¼ŒåŒå‡»åQˆåºŸè¯ï¼‰åQŒå‡ºçŽîC¸€ä¸ªç°è‰²çš„界面åQŒå¤§å®¶ä¸è¦æ€¥ï¼Œ˜q™æ˜¯å› äØ“(f¨´)它没有发现运行的android½E‹åºå‘?
    ½W¬äºŒæ­¥ï¼š(x¨¬)启动android½E‹åºåQŒï¼ˆæˆ–者连接android手机åQ‰ï¼Œä½ ä¼š(x¨¬)发现åœ?Hierarchy Viewer çš?Devices里有 emulator-5554(˜q™ä¸ªæ˜¯æˆ‘的模拟器)åQŒç„¶åŽé€‰æ‹© start servier
    如图


    选择 MainActivityåQŒç‚¹å‡»Load view Hierarchy
    如图


    你还可以通过左下角的按钮交换到界面视�



    ˜q™å°±æ˜¯ä½ æ‰‹æœºä¸Šçœ‹åˆ°çš„æ•ˆæžœåQŒçœ‹åˆ°è“è‰²çš„¾l†çº¿æ²¡æœ‰åQŸä½ å¯ä»¥æ‹–动他,双™¾¹ä¼?x¨¬)显½CÞZ»–的颜色的坐标
    你也可以把这些东西导出来åQŒæ€Žä¹ˆæ ?好用å?

    ]]>
    android ListView详解http://www.aygfsteel.com/caizh2009/archive/2010/11/14/338033.htmlž®èœæ¯›æ¯›ž®èœæ¯›æ¯›Sun, 14 Nov 2010 08:28:00 GMThttp://www.aygfsteel.com/caizh2009/archive/2010/11/14/338033.htmlhttp://www.aygfsteel.com/caizh2009/comments/338033.htmlhttp://www.aygfsteel.com/caizh2009/archive/2010/11/14/338033.html#Feedback0http://www.aygfsteel.com/caizh2009/comments/commentRss/338033.htmlhttp://www.aygfsteel.com/caizh2009/services/trackbacks/338033.html阅读全文

    ]]>
    从零开始学Androidhttp://www.aygfsteel.com/caizh2009/archive/2010/07/07/325426.htmlž®èœæ¯›æ¯›ž®èœæ¯›æ¯›Wed, 07 Jul 2010 03:00:00 GMThttp://www.aygfsteel.com/caizh2009/archive/2010/07/07/325426.htmlhttp://www.aygfsteel.com/caizh2009/comments/325426.htmlhttp://www.aygfsteel.com/caizh2009/archive/2010/07/07/325426.html#Feedback0http://www.aygfsteel.com/caizh2009/comments/commentRss/325426.htmlhttp://www.aygfsteel.com/caizh2009/services/trackbacks/325426.html从零开始ã€?

    >1 下蝲Android SDK ,然后带着不求甚解的态度去阅�SDK 里的官方文档�
       没有手机软äšg开发经验、Java 以及(qi¨¢ng) eclipse 使用¾léªŒçš„æœ‹å‹ä¸å¿…担心,我也是一栗÷€?
       刚开始接触不可能一下就看明白,先大体扫一下官æ–ÒŽ(gu¨©)–‡æ¡£ï¼Œäº†è§£ä¸€ä¸‹åŸºæœ¬æ¦‚念,不需要完全理解,
       有点印象ž®Þp¡Œäº†ã€?

    >2 � http://www.eoeandroid.com/viewthread.php?tid=772&extra=page%3D1
       下蝲 eoe 特刊~ 写的很不错,你首先需要看完第一期,ž®±å¯ä»¥æŠŠå¼€å‘环境搭建好了ã€?
       其他几期可以½EåŽå†çœ‹ã€?
     
    >3 查阅官方文档åQŒæŒ‰ç…§é‡Œè¾¹çš„ hello world 教程一步一步做åQŒå¾ˆå¿«ä½ çš„第一ä¸?android ™å¹ç›®ž®±å¯ä»?
       成功˜qè¡Œäº†ï¼

    >4 接下来你应该学习(f¨¤n)官方文档里的è®îCº‹æœ¬äº†åQŒè¿™ä¸ªè¦½Eå¾®èŠÞq‚¹æ—‰™—´åQŒåšçš„过½E‹å¯èƒ½æœ‰ä¸€äº›ç–‘问,没关¾p»ï¼Œ
       大胆忽略åQŒåªè¦å¯ä»¥æˆåŠŸè¿è¡Œå³å¯ã€?

    >5 看了一大堆英文的东西,也有不少疑问了,应该看一些中文的文档来加æ·Þq†è§£äº†ã€?
       强烈推荐  深入淺出 Android -- Google 手持­a­å‚™æ‡‰ç”¨½E‹å¼­a­è¨ˆå…¥é–€      
       http://code.google.com/p/androidbmi/wiki/DiveIntoAndroid
       虽然是繁体的åQŒä½†æ˜¯æ–‡ç« çš„质量相当高,看完之后基本上就可以½Ž—是入门了!

    >6 æŽ¥ä¸‹æ¥ï¼Œå»ø™®®æŠ?eoe 特刊的其它几期都看完åQŒç›¸ä¿¡ä½ å¯¹ä¸€äº›å¸¸è§çš„开发需求就很有把握了ã€?

    >7 请加入hong老大建的¾Ÿ¤ï¼Œ˜q™é‡Œæœ‰å¾ˆå¤šå¯¹android 感兴­‘?的兄弟,大家可以一èµähŽ¢è®¨ã€?
        http://groups.google.com/group/china-android-dev
     
    >8 推荐几个不错的博客,
       http://haric.javaeye.com/ 
       http://rayleung.javaeye.com/
          
    >9 可以¾lå¸¸åŽ? http://www.eoeandroid.com/forumdisplay.php?fid=27 ˜q™é‡Œé€›é€›ã€?

    >10 惛_¼€å§‹åšapp赚钱了? 呵呵åQŒæŠŠ javaeye 里移动编½E‹æ¿å—çš„¾_‘֍Žè‰¯å¥½è´´éƒ½¾˜ÖM¸€éå§~ ¼œç¦ä½ ï¼

    转自åQ?/span>http://www.javaeye.com/topic/473980



    ]]>
    史上最全的android开发资料大集合http://www.aygfsteel.com/caizh2009/archive/2010/06/11/323342.htmlž®èœæ¯›æ¯›ž®èœæ¯›æ¯›Fri, 11 Jun 2010 05:29:00 GMThttp://www.aygfsteel.com/caizh2009/archive/2010/06/11/323342.htmlhttp://www.aygfsteel.com/caizh2009/comments/323342.htmlhttp://www.aygfsteel.com/caizh2009/archive/2010/06/11/323342.html#Feedback0http://www.aygfsteel.com/caizh2009/comments/commentRss/323342.htmlhttp://www.aygfsteel.com/caizh2009/services/trackbacks/323342.html 1、【eoeAndroid特刊】第一æœ?Andriod 1.5 SDK½Ž€ä»? http://download.csdn.net/source/2399809

    2ã€? 【eoeAndroid特刊】第二期 囑փå¤„理½‹‡ï¼ˆ1åQ? http://download.csdn.net/source/2399814

    3ã€? 【eoeAndroid特刊】第三期 Android Marketå?qi¨¢ng)应用发å? http://download.csdn.net/source/2399818

    4� 【eoeAndroid特刊】第五期 Android widget http://download.csdn.net/source/2399825

    5ã€? 【eoeAndroid特刊】第六期 数据通信-æˆäØ“(f¨´)Android数据‹¹å¤§å¸?http://download.csdn.net/source/2399830

    6� 【eoeAndroid特刊】第七期 NDK http://download.csdn.net/source/2400070

    7� 【eoeAndroid特刊】第八期 数据存储操作 http://download.csdn.net/source/2399834

    8� 【eoeAndroid特刊】第八期+ 开发技� http://download.csdn.net/source/2399841

    9ã€? 【eoeAndroid特刊】第ä¹?ji¨¦)æœ? http://download.csdn.net/source/2400075

    10ã€? android开发教½E? http://download.csdn.net/source/2400084

    11� android基础教程 http://download.csdn.net/source/2425923

    12� Google手机开发《Android.A.Programmers.Guide� http://download.csdn.net/source/2425883

    13� Professional.Android.Application.Development.2009 http://download.csdn.net/source/2425899

    14� Apress.Android.Essentials.Jul.2008 http://download.csdn.net/source/2425905

    15� android开发入门与实践 http://download.csdn.net/source/2425931

    16� android开发入门与实践源代� http://download.csdn.net/source/2425935

    17� Android应用框架原理和程序设� http://download.csdn.net/source/2399790

    18ã€? android JNI ½Ž€ä»‹ä¸Žå®žçް http://download.csdn.net/source/2425864

    19ã€? 19、Android开发指南中文版 æ·ÕdŠ æ­¤é“¾æŽ¥ï¼š(x¨¬)http://download.csdn.net/source/2426094
    20、android ADT-0.9.6 http://download.csdn.net/source/2399804

    21ã€? android-sdk2.2 http://developer.android.com/sdk/android-2.2.html 


    另外附视频资源网址
    《Google Android开发入门与实战随书视频》WMV[压羃包] http://www.verycd.com/topics/2779532/
    上传最新资源:(x¨¬)android中文帮助文档 http://download.csdn.net/source/2447570


    ]]>
    Ö÷Õ¾Ö©Öë³ØÄ£°å£º Äϵ¤ÏØ| Äþº£ÏØ| ·±ÖÅÏØ| ²ìÓçÏØ| ТÒåÊÐ| ËÄ»áÊÐ| ÄÏÕÄÏØ| ½õÖÝÊÐ| ÓñÃÅÊÐ| ÑγØÏØ| Ë³Æ½ÏØ| ÄϾ¸ÏØ| ÌìÃÅÊÐ| Æ½ÒØÏØ| ½£´¨ÏØ| ïö¹éÏØ| ÁÙ°²ÊÐ| ½¨µÂÊÐ| ÑØºÓ| ºÏ×÷ÊÐ| Ò×ÃÅÏØ| ÁÙ¹ðÏØ| ÆëÆë¹þ¶ûÊÐ| ÏæÌ¶ÊÐ| Õã½­Ê¡| ¹óÖÝÊ¡| ÆÁÄÏÏØ| ÅíÖÝÊÐ| ¹ð¶«ÏØ| Ëç·ÒºÓÊÐ| ½­°²ÏØ| ÇØ»ÊµºÊÐ| µÂ»¯ÏØ| вÌÏØ| Æ½Ô¶ÏØ| èµÉ½ÏØ| ÇØ°²ÏØ| ÎÚ³ľÆëÏØ| ÅÌÉ½ÏØ| ̨ÖÝÊÐ| ÅíÔóÏØ|