应用程序核心
[一点点想法]
最近又找了一本安卓的书看,越看越觉得以前了解到的实在是太少了,同时也缺乏思考,很长一段时间都是在机械的敲代码,而很少想到去想想为什么这么做,这么做有什么好处,有没有更好的办法来实现它。看到一个学长在做他们团队的一个项目的安卓前台,深感自己太low。接下来,我也是希望先打好基础然后再深入,所以我又回到了安卓的基础知识上面,一点一点把这些概念属性都弄清楚。现在我看到一个APP就会去想,像这个功能是怎么实现的,这个界面是怎么做的这么简单又美观的。我把手机上设置了显示布局边界,看到上面的边界线,我就会想,这个布局这个组件是什么样的。我觉得,这是思想上的一种进步吧。
一、应用程序的基本组件
Android的应用程序并不像C中的main()函数入口是唯一的,它可以有多个启动入口,它是由多个不同的组件组合而成的,而组件之间是通过Intent来实现通信的(Intent也是一种基本组件,这个地方可能会让人觉得很诧异)。
基本组件:
包括Activity、Service、BroadcastReceiver、ContentProvider、Intent。
Service:Service并不像Activity那样有可见的用户界面,但它的特点是能长时间在后台运行,比如说,当我们在发短信或干其他事情的时候,音乐播放器还在后台播放音乐。
BroadcastReceiver:BroadcastReceiver是拥护接受广播通知的组件当它接收到某个通知消息之后,它可以启动Activity作为相应,或者是通过NotificationMananger来作为提醒。
ContentProvider:ContentProvider可以把应用程序A的数据提供给应用程序B使用,比如说我们在发短信的时候需要使用到联系人这一应用程序的数据。
这些都只是一些理论,等接触到它们的应用再来仔细说明吧。
二、应用程序的生命周期
Android有一个特殊性就是进程无法控制自己的生命周期,即影响因素是看进程的重要性处于哪一级别,而具体影响的因素则是组件特别是Activity的状态。进程被分内为:前台进程、可见进程、服务进程、后台进程、空进程。重要程度依次降低。越不重要的进程,在内存不够的时候越容易被舍弃,即destroy。
//MainActivity
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;
public class MainActivity extends Activity implements OnClickListener {
private String number;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);// 隐藏标题
setContentView(R.layout.activity_main);
Button bt_test = (Button) this.findViewById(R.id.button1);
bt_test.setOnClickListener(this);
System.out.println("MainActivityonCreate");
}
public void onClick(View v) {
Intent intent = new Intent();
intent.setClass(MainActivity.this, O2Activity.class);
this.startActivity(intent);
}
protected void onStop() {
System.out.println("MainActivityonStop");
super.onStop();
}
protected void onPause() {
super.onPause();
System.out.println("MainActivityonPause");
}
protected void onResume() {
super.onResume();
System.out.println("MainActivityonResume");
}
protected void onStart() {
super.onStart();
System.out.println("MainActivityonStart");
}
protected void onRestart() {
super.onRestart();
System.out.println("MainActivityonRestart");
}
protected void onDestroy() {
super.onDestroy();
System.out.println("MainActivityonDestroy");
}
}
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
public class O2Activity extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_o2);
System.out.println("O2ActivityonCreate");
}
protected void onStop() {
System.out.println("O2ActivityonStop");
super.onStop();
}
protected void onPause() {
super.onPause();
System.out.println("O2ActivityonPause");
}
protected void onResume() {
super.onResume();
System.out.println("O2ActivityonResume");
}
protected void onStart() {
super.onStart();
System.out.println("O2ActivityonStart");
}
protected void onRestart() {
super.onRestart();
System.out.println("O2ActivityonRestart");
}
protected void onDestroy() {
super.onDestroy();
System.out.println("O2ActivityonDestroy");
}
}
我们通过重写方法给它加上一个输出语句来进行测试,我们首先打开应用程序,点击按钮,到达第二个界面,在点返回键,回到第一个界面。
接下来,我们来测试当第二个Acitivity并没有完全铺满屏幕的时候的输出情况:
三、资源
资源包括:XML文件,位图文件(图片),Raw文件(如音频文件)
在这里要提到的是,我们可以新建一个Andorid XML File ,这里面有很多中类型,layout、string等等,我们也知道,在Android里面是用不了gif图片的,我们就只能一张一张的图片画,我们可以在new一个Andorid XML File的时候,勾选Animator这样的Resource Type,然后我们在里面将我们需要的动画一张张弄上去并设定好转换的时间,然后在需要这张动态图的时候调用这个文件就可以了。
还有,像微信、QQ、优酷这些APP,我们可以看到它们有一个固定的栏目,可以选择消息、联系人、动态这些,我以前一直以为这是用线程然后在一个Acitivity中画上去的,而且像QQ有消息、联系人、动态这三个选项一样,需要三个Activity,后来才发现,真是很天真,只需要一个Acitivity。我们先用一个布局比如说是LinearLayout或者是TableLayout使那些选项的位置不会随手机平台的改变而改变,再在下面添加一个空的ImageView,然后我们可以去new一个Android XML Layout File,当它点击到“联系人”时,我们就用这个新建的布局文件去替换以前那个空View。
这其中,是让当前这个Acitvity继承自FragmentActivity而不是Activity,并且用以下代码让它们发生替换:
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.replace(arg0, arg1)
ft.commit();
引用资源的方法:
1、在程序中引用资源
R.resource_type.resource_name
2、在资源中引用资源
@[resource_type]/[resource_name]
<!--EndFragment-->