android 工程结构,它到底是怎么运行的。
为了帮助理解,我决定先上传一个工程截图,这个是我做的一个小作业,3、4个小时完成,没什么含金量,就是交差用的,这里给大家做个模板吧。
我把一个工程分6个部分,如左面的图所示,然后来一一说好了。 1. 这里就是存放我们写的类的,由于我这个简单,就没有分很多包了,一个包搞定一切。 2. 这个是编译生成的,里面有个R.java文件,千万不要乱动它,会导致很可怕的错误,另外,如果明明写的很对,但是就是编译通不过的话,一定是这个东西除了问题,可以上网搜搜解决办法,不知道能不能删了这个文件重新编译。 3. 这个三个文件夹是用来放图片的,比如自己做的按钮啊什么的,分高(hdpi)中(mdpi)低(ldpi)三种像素图片文件夹,在不同屏幕下调用不同像素的图片。 4. 看名字就知道,这是些UI的地方,这里写好了以后,在java文件里调用。 5. 这个是存放一些字符串的,比如有些字符串常用到啊,多处被引用的话,就给它取个名字放到这里,然后就可以实现字符串共享了。 6. 就是上一篇介绍过的,声明activity和权限的地方。
所以,综上所述,一个android程序被运行的时候,程序先在manifest文件里找到入口类,然后进入入口类的onCreate()函数开始执行,其中UI在layout文件夹中调用,图片在res文件夹中调用。
|
接下来我们进入代码,用代码稍微分析一下,就清楚了:
首先,我们看到在manifest文件里申明了入口类是SecretDiaryActivity.java:
<activity android:name=".SecretDiaryActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
接着我们进入到SecretDiaryActivity.java文件,找到onCreate()函数:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.diary_list);
mDbHelper = new DiaryDbAdapter(this);
ll=(LinearLayout)findViewById(R.id.bg); //part one
mDbHelper.open();
// code=(EditText)
//取回所有库中的日记显示
// if(currentbg)
if(mDbHelper.isCode()){
Intent i = new Intent(this, EnterPage.class);
startActivityForResult(i, ACTIVITY_ENTER);
}
int bg=mDbHelper.getbg();
Resources resources = getBaseContext().getResources();
Drawable btnDrawable=resources.getDrawable(R.drawable.bg);
switch(bg){
case 0:
break;
case 1:
btnDrawable=resources.getDrawable(R.drawable.bg2);
break;
case 2:
btnDrawable=resources.getDrawable(R.drawable.bg3);
break;
}
ll.setBackgroundDrawable(btnDrawable);
renderListView(); //part two
}
可以看到,setContentView(R.layout.diary_list);这一句,就是定义了这个activity的layout调用的是哪个xml文件。
顺带看一下,标注了part one的这一句,就是用来申明一个UI的,根据ID来查找布局,这个时候我们就需要找到名字叫做bg的一个LinearLayout,这个时候用到的就是上面的第二部分,gen文件夹下的R.java文件,编译器从这里找到bg的物理地址,我们看到bg的定义其实在diary_list.xml文件中:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/bg"
>"
<ListView android:id="@+id/android:list"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>"
<TextView android:id="@+id/android:empty"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="还没有开始写日记哦亲!\n点击Menu按钮开始写日记吧:)"
android:layout_margin="20px"
android:textSize="17px"
android:textStyle="bold"
android:textColor="#000"
/>
</LinearLayout>
文件第五行进行了对一个layout布局的id定义,这里任何一个控件,布局,都可以给它一个id,以方便在java文件中调用并操作它,利用ID找到它之后,我们就可以通过ll来操作它了,比如这里我用ll给bg设置了一个背景。
这就是一个android软件的大致架构了,知道了运作流程,可以很方便的知道什么时候该在哪里写东西了,接下来如何去做具体的功能还是要查看官方的guide了~。