??xml version="1.0" encoding="utf-8" standalone="yes"?>日韩欧美www,国产高清一区二区三区,国产精品精品视频一区二区三区http://www.aygfsteel.com/freeman1984/category/42532.html STANDING ON THE SHOULDERS OF GIANTSzh-cnWed, 19 Oct 2011 12:36:09 GMTWed, 19 Oct 2011 12:36:09 GMT60android 学习(fn)之安?/title><link>http://www.aygfsteel.com/freeman1984/archive/2009/11/20/303063.html</link><dc:creator>@joe</dc:creator><author>@joe</author><pubDate>Fri, 20 Nov 2009 07:49:00 GMT</pubDate><guid>http://www.aygfsteel.com/freeman1984/archive/2009/11/20/303063.html</guid><wfw:comment>http://www.aygfsteel.com/freeman1984/comments/303063.html</wfw:comment><comments>http://www.aygfsteel.com/freeman1984/archive/2009/11/20/303063.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/freeman1984/comments/commentRss/303063.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/freeman1984/services/trackbacks/303063.html</trackback:ping><description><![CDATA[<p>  <strong>1 下蝲最新的 Android SDK</strong> <br />  最q?nbsp; <a target="_blank" mce_>http://developer.<span id="wmqeeuq" class="t_tag">android</span>.com</a>不知道咋回事下蝲不了(jin) Q给大家提供一个地   址<a mce_> http://dl.google.com/android/android-sdk-windows-1.6_r1.zip</a>  速度很快 我这700k左右</p> <p>  2 下蝲 JDK6 <br /> <a mce_>http://java.sun.com/javase/downloads/index.jsp</a> <br /> <br /> <strong>3Q下?Eclipse 3.2Q?.3版本Q开?Android?IDEQ?/strong> <br /> <a mce_>http://www.eclipse.org/downloads/</a> </p> <p> </p> <p>     </p> <p> <strong>然后安装android的eclipse插g</strong></p> <p> </p> <p>1.  启动 Eclipse, 选择  Help > Software Updates > Find and Install..<br /> 2.  弹出对话框后Q选择  Search for new features to install 点击 Nex<br /> 3.  点击  New Remote Site.  <br /> 4.  在编辑框中输入更新插件的|址: <br /> <a mce_>https://dl-ssl.google.com/android/eclipse/</a>. 点击  OK<br /> 5.  看到一个更新的列表Q点?sFinish.  <br /> 6.  在返回的对话框中选择  Android Plugin > Eclipse Integration > <br /> Android Development Tools q且点击 Next.  <br /> 7.  选择  Accept terms of the license agreement, 点击 Next.  <br /> 8.  点击  Finish.  <br /> 9.  点击 Install All.  <br /> 10. 重新启动 Eclipse.  </p> <p>q样安装完毕了(jin)</p> <p> </p> <p> </p> <p><strong>4 讄a(chn)ndroid的sdk目录</strong></p> <p><img height="555" alt="" src="http://dl.javaeye.com/upload/picture/pic/45775/ebcd1665-c0aa-3150-a8a5-f1c520bc8c62.png" width="687" mce_src="http://dl.javaeye.com/upload/picture/pic/45775/ebcd1665-c0aa-3150-a8a5-f1c520bc8c62.png" /></p> <p><strong>5 建立新项?/strong></p> <p><img height="496" alt="" src="http://dl.javaeye.com/upload/picture/pic/45779/2173bde1-c6f4-37da-88d0-1235c16fcc61.png" width="523" mce_src="http://dl.javaeye.com/upload/picture/pic/45779/2173bde1-c6f4-37da-88d0-1235c16fcc61.png" /></p> <p>输入信息Q?/p> <p><img height="729" alt="" src="http://dl.javaeye.com/upload/picture/pic/45781/5dcdaf67-8ce2-3706-916f-e21fa55b05d7.png" width="523" mce_src="http://dl.javaeye.com/upload/picture/pic/45781/5dcdaf67-8ce2-3706-916f-e21fa55b05d7.png" /></p> <p> q行q时候会(x)提示Q?/p> <p> <img height="158" alt="" src="http://dl.javaeye.com/upload/picture/pic/45773/0d07f09e-5039-37ef-ab62-c4dcaedea814.png" width="522" mce_src="http://dl.javaeye.com/upload/picture/pic/45773/0d07f09e-5039-37ef-ab62-c4dcaedea814.png" /></p> <p>也就是说需要我们徏立android的虚拟设备区支持我们的sdk 1.6</p> <p> 选择yesQ输入信?其中选择1.6的那?/p> <p><img height="426" alt="" src="http://dl.javaeye.com/upload/picture/pic/45771/bf8703bd-01f4-3561-8736-40ac9d42ebd1.png" width="740" mce_src="http://dl.javaeye.com/upload/picture/pic/45771/bf8703bd-01f4-3561-8736-40ac9d42ebd1.png" /></p> <p> </p> <p>选择createAvd</p> <p>也可以通过命o(h)来徏立:(x)</p> <p>q时候就需要在环境变量的path里面W一步解压sdk的根目录下的tools目录Q或者直接{向tools目录再运?/p> <p>命o(h)<font class="" style="font-family: " face="Arial" color="#333333">android create avd --target 2 --name avdname</font></p> <p> </p> <p>然后可以运行我们的E序?/p> <p> 昄l果Q?/p> <p><img height="557" alt="" src="http://dl.javaeye.com/upload/picture/pic/45769/bbba3937-eb1f-3eeb-8699-b083a55746ef.png" width="792" mce_src="http://dl.javaeye.com/upload/picture/pic/45769/bbba3937-eb1f-3eeb-8699-b083a55746ef.png" /></p> <p> </p> <p>屏幕上的相关信息可见于项目根目录下的res目录Q例如:(x)values/strings.xml</p> <p>内容Q?/p> <p> </p> <p> </p> <pre class="java" name="code"><?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">Hello World, HelloWorld!</string> <string name="app_name">my-first-android-application</string> </resources></pre> <p> </p> <p> <strong>相关问题Q?/strong></p> <p>  Failed to find an AVD compatible with target 'Android 1.6' Qno compatible AVDs with target</p> <p>  Q还有无法找到avd的path问题</p> <p>  Ҏ(gu)我的遭遇Q由于我以前用的盗版xp新徏立的avdq不在当前用L(fng)录下也:(x)我的文档目录是dQ\我的文档 而不?nbsp;  C:\Documents and Settings/administrator   。因此需要将.android目录拯到C:\Documents and Settings\administrator   ?<font class="" style="font-family: " color="#ff0000"><strong>重要的一步是要主意看里面的ini文g里面的\径是否对应,否则?x)出现\径问题:(x)</strong></font></p> <p><font class="" style="font-family: " color="#ff0000"><strong>.android/avd里面以avd名命名的.ini文gQ例如我的是Q?/strong></font></p> <p><font class="" style="font-family: " color="#ff0000"><strong>target=android-4path=C:\Users\qiaobing\.android\avd\dvd6.avdQVista环境Qxp要注意看是否在当前用户下</strong></font></p> <p> 基本上就可以?</p> <p>  </p> <p> </p> <p> </p> <p> </p> <p> </p> <p>  </p> <img src ="http://www.aygfsteel.com/freeman1984/aggbug/303063.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/freeman1984/" target="_blank">@joe</a> 2009-11-20 15:49 <a href="http://www.aygfsteel.com/freeman1984/archive/2009/11/20/303063.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>android Tabhost部ghttp://www.aygfsteel.com/freeman1984/archive/2009/11/18/302803.html@joe@joeWed, 18 Nov 2009 07:44:00 GMThttp://www.aygfsteel.com/freeman1984/archive/2009/11/18/302803.htmlhttp://www.aygfsteel.com/freeman1984/comments/302803.htmlhttp://www.aygfsteel.com/freeman1984/archive/2009/11/18/302803.html#Feedback6http://www.aygfsteel.com/freeman1984/comments/commentRss/302803.htmlhttp://www.aygfsteel.com/freeman1984/services/trackbacks/302803.html阅读全文

@joe 2009-11-18 15:44 发表评论
]]>
android 之listhttp://www.aygfsteel.com/freeman1984/archive/2009/11/14/302376.html@joe@joeSat, 14 Nov 2009 15:08:00 GMThttp://www.aygfsteel.com/freeman1984/archive/2009/11/14/302376.htmlhttp://www.aygfsteel.com/freeman1984/comments/302376.htmlhttp://www.aygfsteel.com/freeman1984/archive/2009/11/14/302376.html#Feedback1http://www.aygfsteel.com/freeman1984/comments/commentRss/302376.htmlhttp://www.aygfsteel.com/freeman1984/services/trackbacks/302376.html阅读全文

@joe 2009-11-14 23:08 发表评论
]]>
android 多语ahttp://www.aygfsteel.com/freeman1984/archive/2009/11/13/302256.html@joe@joeFri, 13 Nov 2009 08:44:00 GMThttp://www.aygfsteel.com/freeman1984/archive/2009/11/13/302256.htmlhttp://www.aygfsteel.com/freeman1984/comments/302256.htmlhttp://www.aygfsteel.com/freeman1984/archive/2009/11/13/302256.html#Feedback0http://www.aygfsteel.com/freeman1984/comments/commentRss/302256.htmlhttp://www.aygfsteel.com/freeman1984/services/trackbacks/302256.html    android?x)根据系llocale的修Ҏ(gu)改变界面的语a状态:(x)如何修改状态:(x)启动模拟器后点击menuQ然后选择setting Q然后选择里面的locale and text 然后选择select localQ打开列表后选择语言q样可以达C改语a区域的目的?br />   如何让我们的E序支持多语aQ?br />  自己感觉有两U方?nbsp;Q?br /> 1Q徏立自q资源文g包,然后重写onConfigurationChanged(newConfig)Ҏ(gu)来处理我们的UIQ这样可以处理非文字资源的切换?br /> 2Q在android规定的目录下建立.xml文gQ由pȝ来处?br /> 我们采用2来试验:(x)
  首先建立android目Q?br /> 然后右键点击res目录建立android xml file Q?br />
  选择region输入cn 选择language 输入Qzh Q输入文件夹名等必要信息ok
 
q样我们选来valus问家里面得strings文g的内容的gҎ(gu)中文可以?jin),然后启动后根据前面介l的修改来改变界面的语言状态的Ҏ(gu)可以实现语a的切换?

@joe 2009-11-13 16:44 发表评论
]]>
android学习(fn)?intent 实例http://www.aygfsteel.com/freeman1984/archive/2009/11/10/301823.html@joe@joeTue, 10 Nov 2009 06:02:00 GMThttp://www.aygfsteel.com/freeman1984/archive/2009/11/10/301823.htmlhttp://www.aygfsteel.com/freeman1984/comments/301823.htmlhttp://www.aygfsteel.com/freeman1984/archive/2009/11/10/301823.html#Feedback2http://www.aygfsteel.com/freeman1984/comments/commentRss/301823.htmlhttp://www.aygfsteel.com/freeman1984/services/trackbacks/301823.html阅读全文

@joe 2009-11-10 14:02 发表评论
]]>
android I/o 例子说明http://www.aygfsteel.com/freeman1984/archive/2009/11/08/android-io.html@joe@joeSun, 08 Nov 2009 05:43:00 GMThttp://www.aygfsteel.com/freeman1984/archive/2009/11/08/android-io.htmlhttp://www.aygfsteel.com/freeman1984/comments/301603.htmlhttp://www.aygfsteel.com/freeman1984/archive/2009/11/08/android-io.html#Feedback4http://www.aygfsteel.com/freeman1984/comments/commentRss/301603.htmlhttp://www.aygfsteel.com/freeman1984/services/trackbacks/301603.html阅读全文

@joe 2009-11-08 13:43 发表评论
]]>
android LogCat使用http://www.aygfsteel.com/freeman1984/archive/2009/11/07/android-logcat.html@joe@joeSat, 07 Nov 2009 14:22:00 GMThttp://www.aygfsteel.com/freeman1984/archive/2009/11/07/android-logcat.htmlhttp://www.aygfsteel.com/freeman1984/comments/301572.htmlhttp://www.aygfsteel.com/freeman1984/archive/2009/11/07/android-logcat.html#Feedback0http://www.aygfsteel.com/freeman1984/comments/commentRss/301572.htmlhttp://www.aygfsteel.com/freeman1984/services/trackbacks/301572.html
   他的log信息是非默认的android控制台窗口,需要另外打开viewQ可以在show view/other/android选择logCat卛_?br />
  说明Q?br /> DQ表CDebug,是代码中的Log.d("tips","Degug");
VQ表CView,是代码中的Log.v("tips","Verbose");
IQ表CDebug,是代码中的Log.i("tips","info");
EQ表CDebug,是代码中的Log.e("tips","Error");
……………………
不同的方法在logCat里面昄的颜色不同,你可以根据你的需要来军_用哪个方法,然后通过上面的VQDQIQW(xu)QE来过滤掉你不需要的东西

@joe 2009-11-07 22:22 发表评论
]]>
android 学习(fn)之listview http://www.aygfsteel.com/freeman1984/archive/2009/11/06/301475.html@joe@joeFri, 06 Nov 2009 10:05:00 GMThttp://www.aygfsteel.com/freeman1984/archive/2009/11/06/301475.htmlhttp://www.aygfsteel.com/freeman1984/comments/301475.htmlhttp://www.aygfsteel.com/freeman1984/archive/2009/11/06/301475.html#Feedback2http://www.aygfsteel.com/freeman1984/comments/commentRss/301475.htmlhttp://www.aygfsteel.com/freeman1984/services/trackbacks/301475.html
代码下蝲  阅读全文

@joe 2009-11-06 18:05 发表评论
]]>
anadroid学习(fn)Q两个activety的{换)(j)http://www.aygfsteel.com/freeman1984/archive/2009/11/04/301114.html@joe@joeWed, 04 Nov 2009 09:39:00 GMThttp://www.aygfsteel.com/freeman1984/archive/2009/11/04/301114.htmlhttp://www.aygfsteel.com/freeman1984/comments/301114.htmlhttp://www.aygfsteel.com/freeman1984/archive/2009/11/04/301114.html#Feedback0http://www.aygfsteel.com/freeman1984/comments/commentRss/301114.htmlhttp://www.aygfsteel.com/freeman1984/services/trackbacks/301114.html 代码Q?br />  ActivityA.java
public class ActivityA extends Activity {
    
/** Called when the activity is first created. */
    @Override
    
public void onCreate(Bundle savedInstanceState) {
        
super.onCreate(savedInstanceState);
        setContentView(R.layout.a);
        
final Button tob = (Button)findViewById(R.id.tob);
        tob.setOnClickListener(
new OnClickListener(){

            
public void onClick(View v) {
                Intent intent 
= new Intent();
                intent.setClass(ActivityA.
this,ActivityB.class);
                startActivity(intent); 
                finish(); 
            }
}
);
    }

}
ActivityB.java
public class ActivityB extends Activity {
    
/** Called when the activity is first created. */
    @Override
    
public void onCreate(Bundle savedInstanceState) {
        
super.onCreate(savedInstanceState);
        setContentView(R.layout.b);
        
final Button toa = (Button)findViewById(R.id.toa);
        toa.setOnClickListener(
new OnClickListener(){

            
public void onClick(View v) {
                Intent intent 
= new Intent();
                intent.setClass(ActivityB.
this,ActivityA.class);
                startActivity(intent); 
                finish(); 
            }
}
);
    }

}

当然需要在xml问h(hun)备注q两个activity


@joe 2009-11-04 17:39 发表评论
]]>
android学习(fn)(各种提示?http://www.aygfsteel.com/freeman1984/archive/2009/11/04/301110.html@joe@joeWed, 04 Nov 2009 09:17:00 GMThttp://www.aygfsteel.com/freeman1984/archive/2009/11/04/301110.htmlhttp://www.aygfsteel.com/freeman1984/comments/301110.htmlhttp://www.aygfsteel.com/freeman1984/archive/2009/11/04/301110.html#Feedback0http://www.aygfsteel.com/freeman1984/comments/commentRss/301110.htmlhttp://www.aygfsteel.com/freeman1984/services/trackbacks/301110.html   
package com.tishi;

import java.util.Calendar;
import java.util.Date;
import java.util.Locale;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.DatePickerDialog;
import android.app.DatePickerDialog.OnDateSetListener;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.TextView;
import android.widget.Toast;

public class TiShi extends Activity implements OnClickListener,
        OnDateSetListener 
{
    
/** Called when the activity is first created. */
    @Override
    
public void onCreate(Bundle savedInstanceState) {
        
super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
final Button click1 = (Button) findViewById(R.id.click1);
        
final Button click2 = (Button) findViewById(R.id.click2);
        
final Button click3 = (Button) findViewById(R.id.click3);
        click1.setOnClickListener(
this);
        click2.setOnClickListener(
this);
        click3.setOnClickListener(
this);
    }


    
public void onClick(View v) {
        
switch (v.getId()) {
        
case R.id.click1:
            showToast();
            
break;
        
case R.id.click2:
            showAlertDialog();
            
break;
        
case R.id.click3:
            showDatePickerDialog();
            
break;
        
default:
            
break;
        }


    }


    
public void showToast() {
        Toast.makeText(TiShi.
this"q是一个提C?/span>", Toast.LENGTH_SHORT).show();
    }


    
public void showAlertDialog() {
        
new AlertDialog.Builder(TiShi.this).setTitle("标题")
                .setMessage(
"提示内容").setPositiveButton("",
                        
new DialogInterface.OnClickListener() {
                            
public void onClick(DialogInterface dialog,
                                    
int whichButton) {
                                setResult(RESULT_OK);
// 定按钮事g
                                finish();
                            }

                        }
)

                .setNegativeButton(
"取消"new DialogInterface.OnClickListener() {

                    
public void onClick(DialogInterface dialog, int which) {
                        TextView txt 
= (TextView) findViewById(R.id.text);
                        txt.setText(
"你选择?jin)取消?/span>");

                    }

                }
).show();
    }


    
public void showDatePickerDialog() {
        Calendar d 
= Calendar.getInstance(Locale.CHINA);
        d.setTime(
new Date());
        
new DatePickerDialog(thisthis, d.get(Calendar.MONTH), d
                .get(Calendar.DAY_OF_MONTH), d.get(Calendar.DAY_OF_YEAR))
                .show();
    }


    
public void onDateSet(DatePicker view, int year, int monthOfYear,
            
int dayOfMonth) {
        TextView txt 
= (TextView) findViewById(R.id.text);
        txt.setText(Integer.toString(year) 
+ "-"
                
+ Integer.toString(monthOfYear) + "-"
                
+ Integer.toString(dayOfMonth));
    }

}


@joe 2009-11-04 17:17 发表评论
]]>
Android pȝ架构http://www.aygfsteel.com/freeman1984/archive/2009/11/04/301089.html@joe@joeWed, 04 Nov 2009 08:21:00 GMThttp://www.aygfsteel.com/freeman1984/archive/2009/11/04/301089.htmlhttp://www.aygfsteel.com/freeman1984/comments/301089.htmlhttp://www.aygfsteel.com/freeman1984/archive/2009/11/04/301089.html#Feedback0http://www.aygfsteel.com/freeman1984/comments/commentRss/301089.htmlhttp://www.aygfsteel.com/freeman1984/services/trackbacks/301089.html

׃CQ可以看到红色的 kernel 层,l色的系l函式库Q黄色的虚拟机器Q以?qing)蓝色?font face="Times New Roman"> Java E序代码。以下将一一介绍?br />
Linux kernel

必也正名乎:(x)一般所U?font face="Times New Roman"> LinuxQ其实是l称Q指根基?font face="Times New Roman"> Linux kernel 以及(qing)其它许多?font face="Times New Roman"> kernel 不见得有关的软g所l成的操作系l。最早,Linux 一词其实是专指 kernelQ它提供?jin)系l底层与g间的基本q_Q让其它E序可以在上头执行。其最早作者是 Linus TorvaldsQ他用自q名字Q加上采用了(jin)?font face="Times New Roman"> Unix pȝ兼容的接口,自q作品命名?font face="Times New Roman"> Linux?br />
如前所qͼ?font face="Times New Roman"> Linux kernel 上头执行的程序,?font face="Times New Roman"> kernel 本n不见得有关系。可以是自由软gQ也可以完全不是。把它加上一些自pYӞ例如基本的函式库、工兗图形接口,应用E序{等Q所l成的一套完整操作系l,才是一般所U的 Linux。ؓ(f)?jin)避免误解,而且也ؓ(f)?jin)正传达自w的贡献Q自pY件基金会(x)大家U呼q样的一套操作系lؓ(f) GNU/Linux。其中的原因是,kernel 提供底层机制Q但pȝ中重要的lg几乎都是来自?font face="Times New Roman"> GNUQ也是自由软g基金?x)?br />
希望大家q没被这些名词搞淗要弄清q些不同的原因是Q?font face="Times New Roman">Android 是在 Linux kernel 上头q作的,但他q不?font face="Times New Roman"> GNU/Linux。因为在一?font face="Times New Roman"> GNU/Linux 里面?x)有的东西?font face="Times New Roman">Android 很多都没有?br />
Linux kernel 的版权是 GNU General Public License version 2 (GPLv2)Q这又是什么玩意呢Q?font face="Times New Roman">GPLv2 是所谓的 Copyleft 版权Q简单来_(d)是Z(jin)保智慧财能够l箋(hu)公开传Q所以Q何基于此创作的g伸创作,都自动采用了(jin)相同版权?font face="Times New Roman">GPL本nq有个特Ԍ是「共同运作」也是延的一部分Q意思是说你的程序没直接?font face="Times New Roman">GPL的程序代码,但是q结?font face="Times New Roman">GPL的东西跟你的E序共同q作Q那你的E序也必采?font face="Times New Roman">GPL版权?br />
举例来讲Q假定今天某公司觉得?font face="Times New Roman">GPL软g不错Q拿来改?jin)改Q放在自q产品里头拿出dQ那某公司就一定要明确的一h布修改后的程序代码。如果没有,那就是触犯版权了(jin)。有个组l叫 GPL ViolationsQ专门抓q种案例Q国内公司如 D-Link 以及(qing) ASUS 都上q榜。这下问题来?jin)?x)如果你是g厂商Q希望你的硬件能?font face="Times New Roman"> Linux kernel 下运作,那么必要有驱动程序。驱动程序就是按照硬件的规格写的E序Q用来告?font face="Times New Roman"> kernel 怎么操作q个g。如果驱动程序的E序代码公开Q等于硬件规g公开的差不多?jin)。许多厂商不愿意q么做,所以就提供~好的驱动程序,但不提供原始码。版权所有者,也就?font face="Times New Roman"> Linus Torvalds 以及(qing)其它许许多多?font face="Times New Roman"> kernel 作者们Qؓ(f)?jin)支持尽可能多的gQ对q种行ؓ(f)是采取睁一只眼闭一只眼的态度Q也是目前q种~译好的驱动E序Q算是处在灰色地带?br />
既然 Android 采用?font face="Times New Roman"> Linux kernelQ当然得照游戏规矩来。但我们从前文可知,Android 的重点就是商业应用,他们可不愿意pȝ里有什么「灰色地带」,于是采用?jin)一些手法来l过q问题。他们把驱动E序Ud“userspace”Q也是_(d)把驱动程序变成在 Linux kernel 上头跑,而不是一赯的东西,q样可以避q?font face="Times New Roman">GPL。然后,?font face="Times New Roman"> kernel q边开个小门,让本来不能直接控制到g?#8220;userspace”E序也可以碰得到Q这样只要把「开个小门」的E序代码公布?yu)p啦。事实上Q目前因?font face="Times New Roman"> Android 已经发行Q所以依法他们已l公开?jin)?font face="Times New Roman"> kernel 的修改,其原始码?font face="Times New Roman"> http://git.android.com/?br />
走笔x(chng)Q可以看?font face="Times New Roman"> Google 的原则之一“Do no evil”是很有意思的。他们自q承诺,而且也愿意公开 Android 的程序代码,但是他们l了(jin)其它?#8220;Do evil”的选择。这栯不是 Do no evil 呢?当作哲学问题吧?br />
关于 Android ?font face="Times New Roman"> kernel 的修改,Google 的简报还提供?jin)两个重点?x)

Binder (IPC)Q提供有效率的程序间沟通管?font face="Times New Roman">(Inter-Process Communication)?font face="Times New Roman">Android pȝ中有很多服务Q而上层的应用E序l常要取用这些服务,一般的 Linux pȝ已经提供?jin)不?font face="Times New Roman"> IPC 的方式,不过 Android q是搞了(jin)套自q。虽说文件中解释原因为「一?font face="Times New Roman"> IPC ?x)造成额外资源pQ以?qing)安全问题」,但其实这些都是可以基于原有架构在 kernel 外头解决的,Z要改?font face="Times New Roman"> kernel 里头Q笔者对此存疑,也只能等找时间去研究E序代码才知?jin)?br /> Power ManagementQ与桌上型计机或笔记型计算Z同,手持装置的电(sh)源一向相当有限,必须无所不用其极的去惛_法省?sh),但又不损及(qing)顺畅的使用l验?font face="Times New Roman">Android 在此采取?jin)颇为积极的作法Q「没有h说要用,关掉」。例如某E序在放 MP3 音乐Q于是此E序?x)需?font face="Times New Roman"> CPU 的计能力,那就得开口要。如果与此同时没其它E序在执行,那么 LCD 昄器就可能被关掉,藉以省电(sh)。另一特别处,是在?font face="Times New Roman"> Linux kernel 一般考虑的都是在计算Z的作法,所以多半只有进入暂停、休眠等{的选择Q而不?x)如此细致的L制到各个装|的甉|供应?br /> pȝ函式?br />
q里说的pȝ函式库是?#8220;native libraries”Q是跑在pȝ里头的函式库Q采用的语言不是 JavaQ提供一些基。里头有几个值得一提的lgQ?br />
BionicQ这?font face="Times New Roman"> Android 版的 libc?font face="Times New Roman">libc ?font face="Times New Roman"> GNU/Linux 以及(qing)其它cM Unix pȝ上最基础的函式库Q一般最常用的是 glibcQ就?font face="Times New Roman"> GNU 做的 libc。不然在比较?yu)型的装|上也可以用 uclibc。不论是 glibc or uclibcQ版权都?font face="Times New Roman">LGPL (GPL 的略为弱化版)。看到这大概可以猜到?jin)吧Q又?font face="Times New Roman"> Copyleft 问题。官方的说法是,除了(jin)版权问题?sh)外Q还考虑必须轻量以及(qing)快速,所以才做了(jin)自己?font face="Times New Roman"> libc。不q轻量、快速,本来是型装置用的 uclibc 一开始的目标Q因此,最主要的恐怕还是版权问题?br /> WebkitQ鼎鼎大名的 Apple Safari 览器背后的引擎是 WebkitQ?font face="Times New Roman">Android 也包含进M(jin)。离U用的 html 配上 html 5 的一些新发展Q生了(jin)各种有趣的可能,q部分值得另文介绍Q这里就不再赘述?br /> Surface FlingerQ提供把各种”surface”l合在一L(fng)能力。在q里 surface 解释为程序想要显C在屏幕的东西,可能同一屏幕上有来自不同E序的内容,而这些内Ҏ(gu)可能?font face="Times New Roman"> 2D 昄或是 3D 昄{等之类?font face="Times New Roman">Surface flinger 是把这些东西结合v来,一起送到屏幕上。目前程序代码还没公布,不过 2D ?font face="Times New Roman"> 3D 的؜合显CZ直都是问题,Ҏ(gu)原因是我们通常告诉 3D 昄卡的东西都是一些「我要在哪里哪里M什么ŞӞ贴上某某材质然后旋{多少度」之cȝ事情Q也是_(d)我们q不知道最后显C出来会(x)长什么样子,那是昄卡上头的 GPU ȝ出来的。一般这些东西是昄在一个有装饰的窗口里_(d)q装饰通常?font face="Times New Roman"> 2D 效果。接下来假定我们惌旋{q整个窗口,而且里头的东西还要l动Q那{于要随时把?font face="Times New Roman"> 3D H口里的东西长什么样子,然后把它?font face="Times New Roman"> 2D 的窗口框框结合,然后再开始{动。目前在一?font face="Times New Roman"> GNU/Linux 上这件事情还没有处理的非常好Q?font face="Times New Roman">Android 怎么做,值得在程序代码公布之后注意?br /> g抽象?font face="Times New Roman"> (Hardware Abstraction Libraries)Q这是前文所q的 userspace 驱动E序Q如果想要将 Android 在某gq_上执行,基本上完成这些驱动程序就行了(jin)。其内定义了(jin) Android 对各g装置例如昄芯片、声韟뀁数字相机?font face="Times New Roman">GPS?font face="Times New Roman">GSM {等的需求?br /> Android Runtime 前文已有涉及(qing)Q这里不再重复。另外蓝色部分的“Application Framework”主要是跟如何?font face="Times New Roman"> Android 上写E序有关p,之后另文介l?/p>
转蝲自:(x)http://hi.baidu.com/weiyousheng/blog/item/43ef7f2e5a457e574fc226a0.html

@joe 2009-11-04 16:21 发表评论
]]>
Android中的Intenthttp://www.aygfsteel.com/freeman1984/archive/2009/11/04/301087.html@joe@joeWed, 04 Nov 2009 08:08:00 GMThttp://www.aygfsteel.com/freeman1984/archive/2009/11/04/301087.htmlhttp://www.aygfsteel.com/freeman1984/comments/301087.htmlhttp://www.aygfsteel.com/freeman1984/archive/2009/11/04/301087.html#Feedback0http://www.aygfsteel.com/freeman1984/comments/commentRss/301087.htmlhttp://www.aygfsteel.com/freeman1984/services/trackbacks/301087.htmlAndroid应用中,主要是由四种lgl成的,q四U组件可参?#8220;Android应用的构?/span>”?而这四种lg是独立的Q它们之间可以互相调用,协调工作Q最l组成一个真正的Android应用。在q些lg之间的通讯中,主要是由Intent协助完成的。Intent负责对应用中一ơ操作的动作、动作涉?qing)数据、附加数据进行描qͼAndroid则根据此Intent的描qͼ负责扑ֈ对应的组Ӟ?Intent传递给调用的组Ӟq完成组件的调用。因此,Intent在这里v着一个媒体中介的作用Q专门提供组件互相调用的相关信息Q实现调用者与被调 用者之间的解耦?br />         例如Q在一个联pMhl护的应用中Q当我们在一个联pMh列表屏幕Q假讑֯应的Activity为listActivityQ上Q点?yn)L个联pMh后,希望能够 跛_此联pMh的详l信息屏q(假设对应的Activity为detailActivityQ,Z(jin)实现q个目的QlistActivity需要构造一?IntentQ这个Intent用于告诉pȝQ我们要?#8220;查看”动作Q此动作对应的查看对象是“某联pMh”Q然后调用startActivity (Intent intent)Q将构造的Intent传入Q系l会(x)Ҏ(gu)此Intent中的描述Q到ManiFest中找到满x(chng)Intent要求的ActivityQ系 l会(x)调用扑ֈ的ActivityQ即为detailActivityQ最l传入IntentQdetailActivity则会(x)Ҏ(gu)此Intent中的?qͼ执行相应的操作?br />
一、抽象描q要描述什?/strong>
        ?strong style="color: black; background-color: rgb(255,255,102)">Android
参考文档中Q对Intent的定义是执行某操作的一个抽象描qͼ实很抽象)(j)。我们先来看看这里的抽象描述Q到底描qC(jin)什么?br />          首先Q?/strong>是要执行的动作(actionQ的一个简要描qͼ如VIEW_ACTIONQ查看)(j)、EDIT_ACTIONQ修改)(j){,Android为我们定义了(jin)一套标准动作:(x)
  • MAIN_ACTION
  • VIEW_ACTION
  • EDIT_ACTION
  • PICK_ACTION
  • GET_CONTENT_ACTION
  • DIAL_ACTION
  • CALL_ACTION
  • SENDTO_ACTION
  • ANSWER_ACTION
  • INSERT_ACTION
  • DELETE_ACTION
  • RUN_ACTION
  • LOGIN_ACTION
  • CLEAR_CREDENTIALS_ACTION
  • SYNC_ACTION
  • PICK_ACTIVITY_ACTION
  • WEB_SEARCH_ACTION
        此外Q我们还可以Ҏ(gu)应用的需要,定义我们自己的动作,q可定义相应的Activity来处理我们的自定义动作?br />
         其次Q?/strong>是执行动作要操作的数据(dataQ,Android?采用指向数据的一个URI来表C,如在联系人应用中Q一个指向某联系人的URI可能为:(x)content://contacts/1。这UURI表示Q通过 ContentURIq个cL描述Q具体可以参?strong style="color: black; background-color: rgb(255,255,102)">android.net.ContentURIcȝ文档?br />         以联pMh应用ZQ以下是一些action / data对,?qing)其它们要表辄意图Q?br />
  • VIEW_ACTION content://contacts/1 -- 昄标识Wؓ(f)"1"的联pMh的详l信?
  • EDIT_ACTION content://contacts/1 -- ~辑标识Wؓ(f)"1"的联pMh的详l信?
  • VIEW_ACTION content://contacts/ -- 昄所有联pMh的列?
  • PICK_ACTION content://contacts/ -- 昄所有联pMh的列表,q且允许用户在列表中选择一个联pMhQ然后把q个联系回给父activity。例如:(x)?sh)子邮g客户端可以用这个IntentQ要求用户在联系人列表中选择一个联pMh

         另外Q?/font>除了(jin)action和dataq两个重要属性外Q还有一些附加属性:(x)
  • categoryQ类别)(j)Q被执行动作的附加信息。例?LAUNCHER_CATEGORY 表示Intent 的接受者应该在Launcher中作为顶U应用出玎ͼ而ALTERNATIVE_CATEGORY表示当前的Intent是一pd的可选动作中的一个,q?些动作可以在同一块数据上执行?
  • typeQ数据类型)(j)Q显式指定Intent的数据类型(MIMEQ。一般Intent的数据类型能够根据数据本w进行判定,但是通过讄q个属性,可以强制采用昑ּ指定的类型而不再进行推对{?
  • componentQ组Ӟ(j)Q指定Intent的的目标lg的类名称。通常Android?Ҏ(gu)Intent 中包含的其它属性的信息Q比如action、data/type、categoryq行查找Q最l找C个与之匹配的目标lg。但是,如果 componentq个属性有指定的话Q将直接使用它指定的lgQ而不再执行上q查找过E。指定了(jin)q个属性以后,Intent的其它所有属性都是可选的?
  • extrasQ?/strong>附加信息Q,是其它所有附加信息的集合。用extras可以为组件提供扩展信息,比如Q如果要执行“发送电(sh)子邮?#8221;q个动作Q可以将?sh)子邮g的标题、正文等保存在extras里,传给?sh)子邮g发送组件?

         MQ?/font>action?data/type、category和extras 一起Ş成了(jin)一U语a。这U语a使系l能够理解诸?#8220;查看某联pMh的详l信?#8221;之类的短语。随着应用不断的加入到pȝ中,它们可以d新的action?data/type、category来扩展这U语a。应用也可以提供自己的Activity来处理已l存在的q样?#8220;短语”Q从而改变这?#8220;短语”的行 为?br />
二?strong style="color: black; background-color: rgb(255,255,102)">Android如何解析Intent

        在应用中Q我们可以以两种形式来用IntentQ?br />
  • 直接IntentQ指定了(jin)component属性的IntentQ调用setComponent(ComponentName)或者setClass(Context, Class)来指定)(j)。通过指定具体的组件类Q通知应用启动对应的组件?
  • 间接IntentQ没有指定comonent属性的Intent。这些Intent需要包含够的信息Q这L(fng)l才能根据这些信息,在在所有的可用lg中,定满此Intent的组件?
        对于直接IntentQ?strong style="color: black; background-color: rgb(255,255,102)">Android
不需要去做解析,因ؓ(f)目标lg已经很明,Android需要解析的是那些间接IntentQ通过解析Q将 Intent映射l可以处理此Intent的Activity、IntentReceiver或Service?br />         Intent解析机制主要是通过查找已注册在AndroidManifest.xml中的所有IntentFilter?qing)其中定义的IntentQ最l找 到匹配的Intent。在q个解析q程中,Android是通过Intent的action、type、categoryq三个属性来q行判断的,判断?法如下:(x)
  • 如果Intent指明定了(jin)actionQ则目标lg的IntentFilter的action列表中就必须包含有这个actionQ否则不能匹配;
  • 如果Intent没有提供typeQ系l将从data中得到数据类型。和action一P目标lg的数据类型列表中必须包含I(xin)ntent的数据类型,否则不能匚w?
  • 如果Intent中的数据不是content: cd的URIQ而且Intent也没有明指定它的typeQ将Ҏ(gu)Intent中数据的scheme Q比?http: 或?mailto: Q?q行匚w。同上,Intent 的scheme必须出现在目标组件的scheme列表中?
  • 如果Intent指定?jin)一个或多个categoryQ这些类别必?strong>全部出现在组建的cd列表中。比如Intent中包含了(jin)两个cdQLAUNCHER_CATEGORY ?ALTERNATIVE_CATEGORYQ解析得到的目标lg必须臛_包含q两个类别?

转蝲自:(x)http://hi.baidu.com/weiyousheng/blog/item/1e5da62417021d3b8744f9cd.html



@joe 2009-11-04 16:08 发表评论
]]>
Android Service介紹http://www.aygfsteel.com/freeman1984/archive/2009/11/04/301085.html@joe@joeWed, 04 Nov 2009 08:04:00 GMThttp://www.aygfsteel.com/freeman1984/archive/2009/11/04/301085.htmlhttp://www.aygfsteel.com/freeman1984/comments/301085.htmlhttp://www.aygfsteel.com/freeman1984/archive/2009/11/04/301085.html#Feedback0http://www.aygfsteel.com/freeman1984/comments/commentRss/301085.htmlhttp://www.aygfsteel.com/freeman1984/services/trackbacks/301085.html本节内容涉及(qing)?br /> 一 什么是Service
?
如何使用Service
?Service的生命周?/font>

一 什么是Service

ServiceQ看名字q道跟正常理解?#8220;服务”差不多,后台q行Q可交互q样的一个东ѝ它跟Activity的别差不多Q但是他不能自己q行Q需要通过某一个Activity或者其他Context对象来调用, Context.startService() ?Context.bindService()?br />
两种启动Service的方式有所不同。这里要说明一下的是如果你?strong style="color: black; background-color: rgb(160,255,255)">Service的onCreate或者onStart做一些很耗时间的事情Q最好在 Service里启动一个线E来完成Q因?strong style="color: black; background-color: rgb(160,255,255)">Service是跑在主U程中,?x)?jing)响到你的UI操作或者阻塞主U程中的其他事情?br />
什么时候需?strong style="color: black; background-color: rgb(160,255,255)">Service呢?比如播放多媒体的时候用户启动了(jin)其他Activityq个时候程序要在后台l播放,比如(g)SD卡上文g的变化,再或者在后台记录你地理信息位|的改变{等QM服务嘛,L藏在后头的?br />

 

?如何使用Service

那接下来用代码来说明一下怎么使用ServiceQ这里我们要讲的是Local Service也就是你自己的一?strong style="color: black; background-color: rgb(160,255,255)">Service, 你也可以操作别的应用E序?strong style="color: black; background-color: rgb(160,255,255)">service如果它允怽那么d的话Q这p计到一个比较麻?ch)的东西interprocess communication (IPC)Q在不同的进E中通信的机Ӟq个我自׃q没有用q,{用?jin)以后再跟大伙说_(d)通常情况下Local的就够用啦?br />
跟Activity一样首先你要写一个类l承?strong style="color: black; background-color: rgb(255,255,102)">android.app.Service,在这里我叫他TestService
代码如下Q?br />

package com.haric.tutorial;

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;

public class TestService extends Service {
private static final String TAG = "TestService";
private NotificationManager _nm;

@Override
public IBinder onBind(Intent i) {
Log.e(TAG, "============> TestService.onBind");
return null;
}

public class LocalBinder extends Binder {
TestService getService() {
return TestService.this;
}
}

@Override
public boolean onUnbind(Intent i) {
Log.e(TAG, "============> TestService.onUnbind");
return false;
}

@Override
public void onRebind(Intent i) {
Log.e(TAG, "============> TestService.onRebind");
}

@Override
public void onCreate() {
Log.e(TAG, "============> TestService.onCreate");
_nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
showNotification();
}

@Override
public void onStart(Intent intent, int startId) {
Log.e(TAG, "============> TestService.onStart");
}

@Override
public void onDestroy() {
_nm.cancel(R.string.service_started);
Log.e(TAG, "============> TestService.onDestroy");
}

private void showNotification() {
Notification notification = new Notification(R.drawable.face_1,
"Service started", System.currentTimeMillis());

PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
new Intent(this, TestServiceHolder.class), 0);

// must set this for content view, or will throw a exception
notification.setLatestEventInfo(this, "Test Service",
"Service started", contentIntent);

_nm.notify(R.string.service_started, notification);
}
}

其中用到Notification是ؓ(f)?jin)明昑֜表?strong style="color: black; background-color: rgb(160,255,255)">Service存活的状态,跟demo的code学过来的Q这L(fng)上去直观一点,更多关于Notification的内容以后UI部分来写吧,现在q道怎么使用好?jin)?/font>

@Override
public void onCreate() {
Log.e(TAG, "============> TestService.onCreate");
_nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
showNotification();
}

像这P我在Service的几个生命周期函C加了(jin)打印l(f)og的语句,方便试?/font>

 

public class LocalBinder extends Binder {
TestService getService() {
return TestService.this;
}
}

q个Ҏ(gu)是ؓ(f)?jin)让调用者得到这?strong style="color: black; background-color: rgb(160,255,255)">Serviceq操作它?br /> Service本npL(fng)单了(jin)Q你需要做什么就在onCreate和onStart里做好了(jin)Qv个线E什么的?br />
再看一下它的调用者,TestServiceHolder

package com.haric.tutorial;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class TestServiceHolder extends Activity {
private boolean _isBound;
private TestService _boundService;

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.test_service_holder);
setTitle("Service Test");

initButtons();
}

private ServiceConnection _connection = new ServiceConnection() {
public void onServiceConnected(ComponentName className, IBinder service) {
_boundService = ((TestService.LocalBinder)service).getService();

Toast.makeText(TestServiceHolder.this, "Service connected",
Toast.LENGTH_SHORT).show();
}

public void onServiceDisconnected(ComponentName className) {
// unexpectedly disconnected,we should never see this happen.
_boundService = null;
Toast.makeText(TestServiceHolder.this, "Service connected",
Toast.LENGTH_SHORT).show();
}
};

private void initButtons() {
Button buttonStart = (Button) findViewById(R.id.start_service);
buttonStart.setOnClickListener(new OnClickListener() {
public void onClick(View arg0) {
startService();
}
});

Button buttonStop = (Button) findViewById(R.id.stop_service);
buttonStop.setOnClickListener(new OnClickListener() {
public void onClick(View arg0) {
stopService();
}
});

Button buttonBind = (Button) findViewById(R.id.bind_service);
buttonBind.setOnClickListener(new OnClickListener() {
public void onClick(View arg0) {
bindService();
}
});

Button buttonUnbind = (Button) findViewById(R.id.unbind_service);
buttonUnbind.setOnClickListener(new OnClickListener() {
public void onClick(View arg0) {
unbindService();
}
});
}

private void startService() {
Intent i = new Intent(this, TestService.class);
this.startService(i);
}

private void stopService() {
Intent i = new Intent(this, TestService.class);
this.stopService(i);
}

private void bindService() {
Intent i = new Intent(this, TestService.class);
bindService(i, _connection, Context.BIND_AUTO_CREATE);
_isBound = true;
}

private void unbindService() {
if (_isBound) {
unbindService(_connection);
_isBound = false;
}
}
}

q里可以看到两种启动Ҏ(gu)Qstart和bindQ当然也是通过intent调用的,在intent中指明指定要启动?strong style="color: black; background-color: rgb(160,255,255)">Service的名字,stop也一?/font> Q?/p> private void startService() {
Intent i = new Intent(this, TestService.class);
this.startService(i);
}

private void stopService() {
Intent i = new Intent(this, TestService.class);
this.stopService(i);
}

对于bind的话Q需要一个ServiceConnection对象

private ServiceConnection _connection = new ServiceConnection() {
public void onServiceConnected(ComponentName className, IBinder service) {
_boundService = ((TestService.LocalBinder)service).getService();

Toast.makeText(TestServiceHolder.this, "Service connected",
Toast.LENGTH_SHORT).show();
}

public void onServiceDisconnected(ComponentName className) {
// unexpectedly disconnected,we should never see this happen.
_boundService = null;
Toast.makeText(TestServiceHolder.this, "Service connected",
Toast.LENGTH_SHORT).show();
}
};

用来把Activity和特定的Serviceq接在一P共同存(sh)Q具体的生命周期l节下一D|讌Ӏ?br />


?
Service的生命周?/font>

Service的生命周期方法比Activity一些,只有onCreate, onStart, onDestroy
我们有两U方式启动一?strong style="color: black; background-color: rgb(160,255,255)">Service,他们?strong style="color: black; background-color: rgb(160,255,255)">Service生命周期的媄(jing)响是不一L(fng)?/font>


1 通过startService

    Service?x)经?onCreate -> onStart
   stopService的时候直接onDestroy

   如果是调用?TestServiceHolder)自己直接退?gu)没有调用stopService?br />    话,Service?x)一直在后台q行?br />    下次TestServiceHolder再v来可以stopService?/font>

 

2 通过bindService   

    Service只会(x)q行onCreateQ?q个时?/font> TestServiceHolder 和TestServicel定在一?br />

   TestServiceHolder 退Z(jin)QSrevice׃(x)调用onUnbind->onDestroyed
   所谓绑定在一起就共存?sh)?jin)?br />

 

那有同学问了(jin)Q要是这几个Ҏ(gu)交织在一L(fng)话,?x)出C么情况呢Q?br /> 一个原则是Service的onCreate的方法只?x)被调用一ơ,是你无论多次的startService?bindServiceQ?strong style="color: black; background-color: rgb(160,255,255)">Service只被创徏一ơ。如果先是bind?jin),那么start的时候就直接q行Service的onStartҎ(gu)Q如果先 是startQ那么bind的时候就直接q行onBindҎ(gu)。如果你先bind上了(jin)Q就stop不掉?jin),对啊Q就是stopService不好使了(jin)Q只 能先UnbindService, 再StopService,所以是先startq是先bind行ؓ(f)是有区别的?br />
看v来情况很多,不过我会(x)把这ơ的代码包括上回Activity生命周期的研I代码都贴上?jin),希望你喜Ƣ!大家有兴可以回ȝ?gu)钮看看logQ多看几遍就知道?jin)?/font>

转蝲自:(x)http://hi.baidu.com/weiyousheng/blog/item/b82f228bb1cdaf1ac9fc7a40.html



@joe 2009-11-04 16:04 发表评论
]]>
Android应用的构?/title><link>http://www.aygfsteel.com/freeman1984/archive/2009/11/04/301083.html</link><dc:creator>@joe</dc:creator><author>@joe</author><pubDate>Wed, 04 Nov 2009 08:02:00 GMT</pubDate><guid>http://www.aygfsteel.com/freeman1984/archive/2009/11/04/301083.html</guid><wfw:comment>http://www.aygfsteel.com/freeman1984/comments/301083.html</wfw:comment><comments>http://www.aygfsteel.com/freeman1984/archive/2009/11/04/301083.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/freeman1984/comments/commentRss/301083.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/freeman1984/services/trackbacks/301083.html</trackback:ping><description><![CDATA[<p> </p> <p>对于一个Android应用E序来说Q是由四U构造块l织而成的,q四U构造块如下Q?/p> <ul> <li>Activity <li>Intent Receiver <li>Service <li>Content Provider </li> </ul> <p>    但是Qƈ不是每一个Android应用E序都需要这四种构造块Q这不是必须的,某些时候,我们只需要这四种中的几种l合成我们的应用?/p> <p> </p> <p>    当我们明了(jin)我们的应用需要哪些构造块后,我们需要在AndroidManifest.xml中登记这些构造块的清单。这是一个XML配置文gQ这个配|文件用于定义我们的应用E序的组件、组件的功能?qing)必要条件等。这个配|文件是每个Android应用必需的。对于AndroidMainfest.xml的SchemaQ参考SDK包附带的文档。以下,我们对四U构造块做一些说明:(x)</p> <p><strong>1、Activity</strong></p> <p>    Activity是Android构造块中最基本的一U,在应用中Q一个activity通常是一个单独的屏幕。每一个activity都被实现Z个独立的c,q且l承于Activityq个基类。这个activitycd?x)显C由几个Views控gl成的用h口,q对事g做出响应。大部䆾的应用都?x)包含多个的屏幕。例如,一个短消息应用E序会(x)有一个屏q用于显CpMh列表Q第二个屏幕用于写短消息Q同时还?sh)(x)有用于览旧短消息及(qing)进行系l设|的屏幕。每一个这L(fng)屏幕Q就是一个activity。从一个屏q导航到另一个屏q是很简单的。在一些应用中Q一个屏q甚至会(x)q回值给前一个屏q?/p> <p>    当一个新的屏q打开后,前一个屏q将?x)暂停,q保存在历史堆栈中。用户可以返回到历史堆栈中的前一个屏q。当屏幕不再使用Ӟq可以从历史堆栈中删除。默认情况下QAndroid会(x)保留从主屏幕到每一个应用的q行屏幕?/p> <p>    Android使用?jin)Intentq个Ҏ(gu)c,实现在屏q与屏幕之间Ud。Intentcȝ于描qC个应用将?x)做什么事。在Intent的描q结构中Q有两个最重要的部分:(x)动作和动作对应的数据。典型的动作cd有:(x)MAINQactivity的门P(j)、VIEW、PICK、EDIT{。而动作对应的数据则以URI的Ş式进行表C。例如:(x)要查看一个h的联pL式,你需要创Z个动作类型ؓ(f)VIEW的intentQ以?qing)一个表C个h的URI?/p> <p>    与之有关pȝ一个类叫I(xin)ntentFilter。相对于intent是一个有效的做某事的hQ一个intent filter则用于描qC个activityQ或者Intent ReceiverQ能够操作哪些intent。一个activity如果要显CZ个h的联pL式时Q需要声明一个IntentFilterQ这个IntentFilter要知道怎么d理VIEW动作和表CZ个h的URI。IntentFilter需要在AndroidManifest.xml中定义?/p> <p>    通过解析各种intentQ从一个屏q导航到另一个屏q是很简单的。当向前DӞactivity会(x)调用startActivity(Intent myIntent)Ҏ(gu)。然后,pȝ?x)在所有安装的应用E序中定义的IntentFilter中查找,扑ֈ最匚wmyIntent的Intent对应的activity。新的activity接收到myIntent的通知后,开始运行。当startActivityҎ(gu)被调用将触发解析myIntent的动作,q个机制提供?jin)两个关键好处?x)</p> <p>    A、Activities能够重复利用从其它组件中以Intent的Ş式生的一个请求;</p> <p>    B、Activities可以在Q何时候被一个具有相同IntentFilter的新的Activity取代?/p> <p><strong>2、Intent Receiver</strong></p> <p>    当你希望你的应用能够对一个外部的事gQ如当电(sh)话呼入时Q或者数据网l可用时Q或者到?jin)晚上时Q做出响应,你可以用一个Intent Receiver。虽然Intent Receiver在感兴趣的事件发生时Q会(x)使用NotificationManager通知用户Q但它ƈ不能生成一个UI。Intent Receiver在AndroidManifest.xml中注册,但也可以在代码中使用Context.registerReceiver()q行注册。当一个intent receiver被触发时Q你的应用不必对h调用intent receiverQ系l会(x)在需要的时候启动你的应用。各U应用还可以通过使用Context.broadcastIntent()它们自qintent receiverq播l其它应用程序?/p> <p><strong>3、Service</strong></p> <p>    一个Service是一D长生命周期的,没有用户界面的程序。比较好的一个例子就是一个正在从播放列表中播放歌曲的媒体播放器。在一个媒体播攑֙的应用中Q应该会(x)有多个activityQ让使用者可以选择歌曲q播放歌曌Ӏ然而,音乐重放q个功能q没有对应的activityQ因Z用者当然会(x)认ؓ(f)在导航到其它屏幕旉乐应该还在播攄。在q个例子中,媒体播放器这个activity?x)用Context.startService()来启动一个serviceQ从而可以在后台保持音乐的播放。同Ӟpȝ也将保持q个service一直执行,直到q个serviceq行l束。另外,我们q可以通过使用Context.bindService()Ҏ(gu)Q连接到一个service上(如果q个serviceq没有运行将启动它)(j)。当q接C个service之后Q我们还可以service提供的接口与它进行通讯。拿媒体播放器这个例子来_(d)我们q可以进行暂停、重播等操作?/p> <p><strong>4、Content Provider</strong></p> <p>    应用E序能够它们的数据保存到文件中、SQL数据库中Q甚x(chng)M有效的设备中。当你想你的应用数据与其它的应用共享时QContent Provider会(x)很有用。一个Content ProvidercdC(jin)一l标准的Ҏ(gu)Q从而能够让其它的应用保存或d此Content Provider处理的各U数据类型?/p> <p>    更详l的Content Provider资料Q可以参考附带文档中的Accessing Content Providers?/p> <img src ="http://www.aygfsteel.com/freeman1984/aggbug/301083.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/freeman1984/" target="_blank">@joe</a> 2009-11-04 16:02 <a href="http://www.aygfsteel.com/freeman1984/archive/2009/11/04/301083.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Android应用的生命周?/title><link>http://www.aygfsteel.com/freeman1984/archive/2009/11/04/301082.html</link><dc:creator>@joe</dc:creator><author>@joe</author><pubDate>Wed, 04 Nov 2009 07:59:00 GMT</pubDate><guid>http://www.aygfsteel.com/freeman1984/archive/2009/11/04/301082.html</guid><wfw:comment>http://www.aygfsteel.com/freeman1984/comments/301082.html</wfw:comment><comments>http://www.aygfsteel.com/freeman1984/archive/2009/11/04/301082.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.aygfsteel.com/freeman1984/comments/commentRss/301082.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/freeman1984/services/trackbacks/301082.html</trackback:ping><description><![CDATA[       在大部䆾情况下,每个Android应用都将q行在自qLinuxq程当中。当q个应用的某些代码需要执行时Q进E就?x)被创徏Qƈ且将保持q行Q直到该q程不再需要,而系l需要释攑֮所占用的内存,为其他应用所用时Q才停止? <p> </p> <p>        Android一个重要ƈ且特D的Ҏ(gu)就是,一个应用的q程的生命周期不是由应用自n直接控制的,而是ql,Ҏ(gu)q行中的应用的一些特征来军_的,包括Q这些应用对用户的重要性、系l的全部可用内存?/p> <p>         对于应用开发者来_(d)理解不同的应用组Ӟ特别是Activity、Service、Intent ReceiverQ对应用q程的生命周期的影响Q这是非帔R要的。如果没有正地使用q些lgQ将?x)导致当应用正在处理重要的工作时Q进E却被系l消毁的后果?/p> <p>        对于q程生命周期Q一个普遍的错误是Q当一个Intent Receiver在它的onReceiveIntent()Ҏ(gu)中,接收C个intent后,׃(x)从这个方法中q回。而一旦从q个Ҏ(gu)q回后,pȝ会(x)认ؓ(f)q个Intent Receiver不再处于zd状态了(jin)Q也׃(x)认ؓ(f)它的宿主q程不需要了(jin)Q除非宿主进E中q存在其它的应用lgQ。从而,pȝ随时都会(x)消毁q个q程Q收回内存,q中止其中还在运行的子线E。问题的解决办法是Q在IntentReceiver中,启动一个ServiceQ这L(fng)l就?x)知道在q个q程中,q有zd的工作正在执行?/p> <p>         Z(jin)军_在内存(sh)x(chng)况下消毁哪个q程QAndroid?x)根据这些进E内q行的组件及(qing)q些lg的状态,把这些进E划分出一?#8220;重要性层?#8221;。这个层ơ按序如下Q?/p> <p>       1、前端进E是拥有一个显C在屏幕最前端q与使用者做交互的ActivityQ它的onResume已被调用Q的q程Q也可能是一个拥有正在运行的IntentReceiverQ它的onReceiveIntent()Ҏ(gu)正在q行Q的q程。在pȝ中,q种q程是很的Q只有当内存?sh)到不于支持这些进E的l箋(hu)q行Q才?x)将q些q程消毁。通常q时候,讑֤已经辑ֈ?jin)需要进行内存整理的状态,Z(jin)保障用户界面不停止响应,只能消毁q些q程Q?/p> <p>      2、可视进E是拥有一个用户在屏幕上可见的Q但q没有在前端昄的ActivityQ它的onPause已被调用Q的q程。例如:(x)一个以对话框显C的前端activity在屏q上昄Q而它后面的上一Uactivity仍然是可见的。这L(fng)q程是非帔R要的Q一般不?x)被消毁Q除非ؓ(f)?jin)保障所有的前端q程正常q行Q才?x)被消毁?/p> <p>       3、服务进E是拥有一个由startService()Ҏ(gu)启动的Service的进E。尽这些进E对于用者是不可见的Q但他们做的通常是用者所x(chng)的事情(如后台MP3播放器或后台上传下蝲数据的网l服务)(j)。因此,除非Z(jin)保障前端q程和可视进E的正常q行Q系l才?x)消毁这U进E?/p> <p>      4、后台进E是拥有一个用户不可见的ActivityQonStop()Ҏ(gu)已经被调用)(j)的进E。这些进E不直接影响用户的体验。如果这些进E正地完成?jin)自q生命周期Q详l参考Activityc)(j)Q系l会(x)Z(jin)以上三种cdq程Q而随时消毁这U进E以释放内存。通常?x)有很多q样的进E在q行着Q因些这些进E会(x)被保存在一个LRU列表中,以保证在内存?sh)Ӟ用户最后看到的q程在最后才被消毁?/p> <p>      5、空q程是那些不拥有Mzd的应用组件的q程。保留这些进E的唯一理由是,做ؓ(f)一个缓存,在它所属的应用的组件下一ơ需要时Q羃短启动的旉。同L(fng)Qؓ(f)?jin)在q些~存的空q程和底层的核心(j)~存?sh)间qpȝ资源Q系l会(x)l常消毁q些IE?/p> <p>      当要对一个进E进行分cLQ系l会(x)选择在这个进E中所有活动的lg中重要等U最高的那个做ؓ(f)依据。可以参考Activity、Service、IntentReceiver文档Q了(jin)解这些组件如何媄(jing)响进E整个生命周期的更多l节。这些类的文档都对他们如何媄(jing)响他们所属的应用的整个生命周期,做了(jin)详细的描q?/p> 转蝲地址Qhttp://hi.baidu.com/weiyousheng/blog/item/c56fa81940f1bd72dbb4bd55.html <img src ="http://www.aygfsteel.com/freeman1984/aggbug/301082.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/freeman1984/" target="_blank">@joe</a> 2009-11-04 15:59 <a href="http://www.aygfsteel.com/freeman1984/archive/2009/11/04/301082.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Android屏幕元素层次l构http://www.aygfsteel.com/freeman1984/archive/2009/11/04/301081.html@joe@joeWed, 04 Nov 2009 07:57:00 GMThttp://www.aygfsteel.com/freeman1984/archive/2009/11/04/301081.htmlhttp://www.aygfsteel.com/freeman1984/comments/301081.htmlhttp://www.aygfsteel.com/freeman1984/archive/2009/11/04/301081.html#Feedback1http://www.aygfsteel.com/freeman1984/comments/commentRss/301081.htmlhttp://www.aygfsteel.com/freeman1984/services/trackbacks/301081.html 本文参考Android提供的相x(chng)档,只对Android的屏q元素的层次l构做一个小l,从M上对Android的界面设计有一个把握,我想q是很有必要的?br />
android.app.Activity
        对于一个Android应用来说Qandroid.app.Activitycd例是一个最基本的功能单元。一个Activity实例可以做很多的事情Q但是它本n无法昄在屏q上Q而是借助于Viewgroup和ViewQ这两个才是Androidq_上最基本的两个用L(fng)面表辑֍元?br />
android.view.ViewGroup
        ViewGroup是一个特D的Viewc,它承于android.view.View。它的功能就是装载和理下一层的View对象和ViewGroup对象。ViewGroup是布局理器(layoutQ及(qing)view容器的基cR?br />         ViewGroup中,q定义了(jin)一个嵌套类ViewGroup.LayoutParams。这个类定义?jin)一个显C对象的位置、大等属性,view通过LayoutParams中的q些属性值来告诉父Q它们将如何攄?br />         在这里,l承于ViewGroup的一些主要的布局cd下:(x)
        1、FrameLayoutQ最单的一个布局对象。它里面只显CZ个显C对象。所有的昄对象都将?x)固定在屏幕的左上角Q不能指定位|。但允许有多个显C对象,但后一个将?x)直接在?一个之上进行覆盖显C,把前一个部份或全部挡住Q除非后一个是透明的)(j)?br />         2、LinearLayoutQ以单一方向对其中的昄对象q行排列昄Q如以垂直排列显C,则布局理器中只有一列;如以水^排列昄Q则布局理器中只有一行。同Ӟ它还可以对个别的昄对象讄昄比例?br />         3、TableLayoutQ以拥有L行列的表格对昄对象q行布局Q每个显C对象被分配到各自的单元g中,但单元格的边框线不可见?br />         4、AbsoluteLayoutQ允总坐标的方式,指定昄对象的具体位|,左上角的坐标?0, 0)Q向下及(qing)向右Q坐标值变大。这U布局理器由于显C对象的位置定死?jin),所以在不同的设备上Q有可能?x)出现最l的昄效果不一致?br />         5、RelativeLayoutQ允?dng)R过指定昄对象相对于其它显C对象或父对象的相对位|来布局。如一个按钮可以放于另一个按钮的双Q或者可以放在布局理器的中央?br />         在Android中,提供?jin)很多的布局理器,q里也不一一列DQ开发者可以根据实际需要,选择合适的布局理器?br />
android.view.View

        View是所有viewcȝ基类Q一个view通常占用屏幕上的一个矩形区域,q负责绘囑֏(qing)事g处理。View是所有窗体部件的基类Q是为窗体部件服务的Q这里的H体部g即UI控gQ如一个按钮或文本框。Android已经为我们提供了(jin)一pd的标准UI控g供我们直接用,同时Q我们也可以通过l承于ViewcLView的子c,来实现我们自定义的UI控g?br />         要定制我们自qUI控gQ需要重载ViewcM的一些方法,以下表格列出View提供出来的,供重载的Ҏ(gu)Q这些方法不必都要重载,但至要实现onDraw(android.graphics.Canvas)Ҏ(gu)?br />
cd Ҏ(gu) 描述
Creation Constructors
onFinishInflate() 当View和它的所有子对象从XML中导入之后,调用此方?/td>
Layout onMeasure(int, int) View?x)调用此?gu)Q来认自己?qing)所有子对象的大?/td>
onLayout(boolean, int, int, int, int, int, int) 当View要ؓ(f)所有子对象分配大小和位|时Q调用此Ҏ(gu)
onSizeChanged(int, int, int, int) 当View大小改变Ӟ调用此方?/td>
Drawing onDraw(Canvas) 当View要绘制它的内Ҏ(gu)Q调用此Ҏ(gu)
Event processing onKeyDown(int, KeyEvent) 当一个新的按键事件发生时Q调用此Ҏ(gu)
onKeyUp(int, KeyEvent) 当一个按键释放事件发生时Q调用此Ҏ(gu)
onMotionEvent(MotionEvent) 当一个动作事Ӟ如触摸)(j)发生Ӟ调用此方?/td>
Focus onFocusChanged(boolean, int) 当View获得或失ȝҎ(gu)Q调用此Ҏ(gu)
Attaching onAttachedToWindow() 当View附加C个窗体上Ӟ调用此方?/td>
onDetachedFromWindow() 当Viewd它的H体Ӟ调用此方?/td>
         以上的事件是Android自动?x)处理的Q而对于其它一些重要的事gQ如鼠标点击{,却必要我们自己手动d到view中,q点比较郁闷Q具体的dҎ(gu)如下Q?br />
public class SendResult extends Activity
{
protected void onCreate(Bundle savedValues)
{
...

Button button = (Button)findViewById(R.id.corky);
button.setOnClickListener(mCorkyListener);
}

private OnClickListener mCorkyListener = new OnClickListener()
{
public void onClick(View v)
{
setResult(RESULT_OK, "Corky!");
finish();
}
};
屏幕元素层次l构


        对于Android应用中的一个屏q,它的屏幕元素是按层次l构来描q的。要一个屏q元素层ơ树(wi)l定在一个屏q上昄QActivity?x)调用它的setContentView()Ҏ(gu)q且传入q个层次?wi)的根节点引用。当Activity被激zdƈ且获得焦Ҏ(gu)Q系l会(x)通知activityq且 h根节点去计算q绘制树(wi)Q根节点׃(x)h它的子节点去l制它们自己?br />         每个?wi)上的ViewGroup节点?x)负责绘制它的子节点。ViewGroup?x)计它的有效空_(d)布局所有的子显C对象,q最l调用所有的子显C对象的Draw()Ҏ(gu)来绘制显C对象。各个子昄对象可以向父对象h它们在布局中的大小和位|,但最l决定各个子昄对象的大和位置的是父对象?/div>
转蝲地址Qhttp://hi.baidu.com/weiyousheng/blog/item/bed1260964dd27a72fddd456.html

@joe 2009-11-04 15:57 发表评论
]]>android学习(fn)Q简易音乐播放详解)(j)http://www.aygfsteel.com/freeman1984/archive/2009/11/04/android.html@joe@joeWed, 04 Nov 2009 05:48:00 GMThttp://www.aygfsteel.com/freeman1984/archive/2009/11/04/android.htmlhttp://www.aygfsteel.com/freeman1984/comments/301040.htmlhttp://www.aygfsteel.com/freeman1984/archive/2009/11/04/android.html#Feedback2http://www.aygfsteel.com/freeman1984/comments/commentRss/301040.htmlhttp://www.aygfsteel.com/freeman1984/services/trackbacks/301040.html阅读全文

@joe 2009-11-04 13:48 发表评论
]]>
android 学习(fn)2 imageViewhttp://www.aygfsteel.com/freeman1984/archive/2009/11/02/300690.html@joe@joeMon, 02 Nov 2009 06:31:00 GMThttp://www.aygfsteel.com/freeman1984/archive/2009/11/02/300690.htmlhttp://www.aygfsteel.com/freeman1984/comments/300690.htmlhttp://www.aygfsteel.com/freeman1984/archive/2009/11/02/300690.html#Feedback0http://www.aygfsteel.com/freeman1984/comments/commentRss/300690.htmlhttp://www.aygfsteel.com/freeman1984/services/trackbacks/300690.html有两U方?

 

 首先找一个png的图片放在res/drawable文g架下Q文件名和扩展名全部用小写(注意Q,我的文g名称Qandroid.png

 

  1.code方式Q?/p>

 

ImageView imageView = new ImageView(this);
imageView.setImageResource(R.drawable.android);//R.drawable.android后面的android是你的图片文件名
setContentView(imageView);

 

        

  2Qxm方式Q?/p>

  修改main.xml

  dQ?/p>

 <ImageView
     android:id="@+id/imageview"
     android:layout_height="wrap_content" //囄原来的size 如果用fill_parent ׃(x)拉
    android:layout_width="wrap_content"
     android:src="@drawable/android" //注意文g?br />     />

  代码加入QsetContentView(R.layout.main);卛_

q行Q?/p>





@joe 2009-11-02 14:31 发表评论
]]>
վ֩ģ壺 غ| | ̩| | ɽ| ƽ| ʡ| | | ¸| ͼ| | | | ˳| | | ǧ| | | | 㶫ʡ| | | ɽ| «| | | ̩| ɽ| ƽԭ| | | | Ž| | ˮ| ̩| ƽ| | |