android 基础概述
废话两三句:这部分我不打算写很多,因为毕竟不是最感兴趣的,也不想将来靠它吃饭。android是大三的时候为了帮同学凑参赛作品边学边做了一点,但是赛后就基本忘干净了,刚接到个电话让我去参加一个笔试内容是android,我不得不斯巴达了,赶紧复习一下,所以说,掌握一技之长还是好的,不要临阵磨枪啊,真是悲剧。
很多人学习android都会从activity看起,但是我当年完全不了解这个东西也还是做出来东西了,其实就是个概念性问题,就算一开始不太懂写代码的时候也会慢慢的懂了。android其实是有官方的developer guide的(地址戳这里),但是因为是英语而且说的很繁琐很细致,所以我觉得,还是自己总结一下,也给入门的同学个方便。
我也就随大流,从activity说起了。
既然是主要用于手机,那么显然,用户和手机互动的时候,屏幕就是交互的平台,可能会和用户交互到的页面,就是一个activity,用户正在交互的页面,就是activity running状态。当然,这不仅限于一个页面,比如有时候弹出来一个框,让你点确定什么的,那么这个窗口才是当前running的,而后面那个则处于pause状态了。
这样的状态针对于每个页面,就会有一个生命周期,用下面的图来表示:
(图片来自android官网的guide页面。) 其实每个状态都能从名字上看出来到底是什么意思,所以我也就不针对没一个做解说了。
可能会有人疑惑running和resume()的关系。其实从图上能看出来running只是一个状态,不是一个函数,当你调用了onResume(),那么这个activity就处于running的状态了。
也可能有人猜想pause和stop的差别,这个onPause()其实就是另外有了一个窗口出现,比如弹出来一个"确定删除吗?"之类的小对话框,这个时候这个对话框并没有布满整个屏幕,后面那个半遮半掩的activity就是onPause状态。 如果你转到另一个页面了,那么前面那个页面就stop了。
在stop之后,这个activity是并没有被杀死的,它还可以执行onRestart()来重启。如果执行了onDestory(),这个activity就是被杀掉了,里面储存的相关数据等就全从内存中抹去了。 |
关于每个activity,都是要进行声明的,也就是要告诉系统哪些页面是activity,哪些是隐藏的(比如数据库文件啊什么的都是隐藏的),关于activity的声明都在一个自动生成的文件里完成。建立一个android工程后(忘了说了,android环境的配置请上网查,教程太多了~),系统自动生成一个文件,在src目录下,叫做AndroidMainifest.xml,每制作一个页面,都一定要来这个声明一下,不然就悲剧了~
语句就用我的一个之前的小作业举例子吧:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.jk0806"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="8" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
<!-- ==============注意这里~!~!~!======================== -->
<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>
<activity android:name=".ActivityDiaryEdit"/>
<!-- ===============注意这里~!~!~!======================== -->
<activity android:name=".SetCode"/>
<activity android:name=".EnterPage"/>
<!-- 关闭应用程序的权限 -->
<uses-permission android:name="\android.permission.RESTART_PACKAGES\" />
</application>
</manifest>
这个是我的小作业里这个文件的完整内容,有一些是自动生成的,我们只注意我框起来那几行。
前面的7行是自动生成的,表示了程序的入口,category字段表示了程序将从这里进入,也就是说,一个应用程序只能有一个activity生命为lanucher。
关于action字段,可以说就是给这个activity定了一个名字,如果你希望别的应用程序可以调用这个activity以完成这个某些目标,就可以给它一个的action定义一个名字,怎么用稍后说明。
我们自己建立一个普通的activity的时候不必那么麻烦,像第8行那样,写一个<activity android:name=".ActivityDiaryEdit"/>就OK了,‘.’后面是文件名。
关于intent类:
intent中文翻译是目的、意义,所以这个类其实是一个描述抽象的操作行为的类,我们利用这个类,来对一个activity进行一系列操作,例如startActivity等,它主要用来在两个activity之间传输数据,类似于两个activity之间的桥。
应用一段代码来边看边学习:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.diary_list);
mDbHelper = new DiaryDbAdapter(this);
ll=(LinearLayout)findViewById(R.id.bg);
mDbHelper.open();
// code=(EditText)
//取回所有库中的日记显示
// if(currentbg)
if(mDbHelper.isCode()){
Intent i = new Intent(this, EnterPage.class);
startActivityForResult(i, ACTIVITY_ENTER);
}
........
}
这段就是上面的mainifest文件里提到的SecretDiaryActivity.java文件。由于声明了这个文件是入口文件,所以app已启动,想找到这个文件,接着就要找到onCreate()函数。
可以看到if语句里就用到了intent类。这个if语句的作用是判断这个app是否加密,如果加密了,就先打开输入密码的页面,也就是EnterPage.java文件。
而打开这个页面,就要借助intent类的实例,然后调用startActivityForResult这个函数,由于我们要保持这个activity不死,所以我们这里要用到的函数带了ForResult,而不是单纯的startActivity,这些都是根据需求选择就好。
之所以要提这个类,就是为了解决刚才的遗留问题,mainefest文件中,有的activity里有intent-filter字段,这样的话就是说这个activity是可以被外部调用的,当我们需要调用一个外部的activity来完成某些功能的时候,就要用这样的语句:
Intent intent = new Intent(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_EMAIL, recipientArray);
startActivity(intent);
//copied from android developer guide page.
intent这架小桥除了连接activity之外,还可以用来传输数据,比如page1要给page2传输一些数据,那么page1的内容如下:
Intent i = new Intent(this,page2.class);
i.putExtra(DiaryDbAdapter.KEY_ROWID, id);
i.putExtra("current_bg", currentbg);
i.putExtra(DiaryDbAdapter.KEY_TITLE, c.getString(c
.getColumnIndexOrThrow(DiaryDbAdapter.KEY_TITLE)));
i.putExtra(DiaryDbAdapter.KEY_BODY, c.getString(c
.getColumnIndexOrThrow(DiaryDbAdapter.KEY_BODY)));
startActivityForResult(i, 2);
这里用putExtra来给intent实例一些数据,并且给他们明了名字,这样,在page2中读取这些数值时,就可以根据名字调取数据了:
Bundle extras = getIntent().getExtras();
if (extras != null) {
String title = extras.getString(DiaryDbAdapter.KEY_TITLE);
String body = extras.getString(DiaryDbAdapter.KEY_BODY);
mRowId = extras.getLong(DiaryDbAdapter.KEY_ROWID);
if (title != null) {
mTitleText.setText(title);
}
if (body != null) {
mBodyText.setText(body);
}
}
用bundle类来读取到extra里携带的数据,就是这么简单,跟jsp中的数据传输好像是类似的。
最后,说一下保存activity的状态
简单来说,就是保存了关闭这个activity时的样子,下次打开的时候的状态跟关闭前是一样的。onSaveInstanceState (Bundle outState);
系统才activity被毁灭的时候会留下一个intanvestate,这样可以保存一些重要的数据,关于save activity state官方也给了图形示意:
当然,一般我们自己是不需要去重载这个函数的,就知道有这么个机制就可以了。
注意,这个函数的调用时在onStop或者onPause之前,如果用户操作使得程序调用onStop而关闭,那么就存不下什么东西了。
好,大体的东西先复习到这里,明天有时间的话就复习下UI设计管理,还有个性图标的制作,这个可就是我的拿手戏了~ヘ( ̄▽ ̄ヘ)