android基础(1)

Android开发主要分为四个模块:activity, service, broadcast receiver以及content provider,其中,可视的只有 activity,用于与用户交互;而 service 是用作于 long-running 的过程,比如在使用别的 app 时仍然能听歌; broadcast receiver 主要用于监听事件并且相应事件,例如短信的接收; content provider 则是可以让多个app能够互相共享并且储存信息。

Android开发分为四个过程:1. defining resources: 有代码与非代码两个部分组成,例如像一些字符串就是存储在 .xml 文件之中; 2. implement classes; 3.package application; 4. install & run。

本文主要分为以下几个部分: 1. activity 生命周期的介绍; 2.intent, permission, fragment的介绍; 3. user interface的介绍。这些介绍主要都是基于 coursera 的 Programming Mobile Applications for Android Handheld Systems: Part 1课程。

activity

- onCreate() : 主要用于在 activity 创建的时候调用,主要分为 加载保存的状态、set content view、初始化UI、将UI元素与actions相互结合 这四个部分
- onRestart() : 在重新返回 activity时调用
- onStart(): 在activity即将变为可视状态是调用
- onResume(): 处在这个状态是可视的并且能够与用户进行互动
- onPause(): 将运行另一个activity时调用
- onStop(): 这时候就不再是可视状态,但是要注意的是当安卓系统决定终止app时并不保证会调用 onStop()
- onDestroy() : 释放资源

所以在一个activity开始时,分别要经过 onCreate()、onStart()、onResume()、RUNNING、onPause()、onStop()、onDestroy()等过程
其中,onStart()到onStop()是可视的,onResume()到onPause()之间是可视的并且可以 interact 的。

在使用一个 activity A来开启另一个 activity B时,可以使用两种方式,startActivity() 与 startActivityForResult(),后一种 B通过setResult()方法来将值存储,并且A 可以通过 onActivityResult() 来获得 B 所存储的值。
需要注意的是,当activity A 调用 activity B 时,这里的调用顺序是确定的, A.onPause() => B.onCreate() => B.onStart() => B.onResume() => A.onStop()

还有需要注意的一点是,当屏幕转动时(从横屏变成竖屏),这里activity会进行重建,因此不做处理的话之前所做的操作都会消失,因此要通过 onSaveInstanceState() 以及 onCreate() 来恢复(这也是onCreate()第一部分 加载保存的状态的意义)。

最后,之所以能够使用 R.string.XX 的原因在于android会根据 res 自动生成名为R的类文件,形如

public final class R {
	public static final class string {
		public static final int XX = … ;
	}
}

intent, permission, fragment

intent

Intent的作用是来确定将要进行的操作或者是已经发生的一个事件。 Intent域中分为多个元素:

- Action: 用来确定所能进行的操作,例如 ACTION_DIAL, ACTION_EDIT 等;
- Data: 存储 URI,并且可以通过 intent.setData(Uri.parse(xxx)) 的方式来存储,例如 xxx 可以是地图 "geo:…"
- Category: 能够处理intent的元素的额外信息
- Type: intent数据的 mime type
- Component
- Extras: 与intent有关的额外信息,例如邮件收件人,是以键值对的形式来存储的
- Flags: 如何处理 intent

有显式和隐式这两种方式来定义 intent:

  • 显式: Intent p = new Intent(context, class),
    其中,context是一个接口,用来获得app的信息,而activity是context的子类,一般是用调用的 activity (caller)作为 context

  • 隐式: 使用的是 intent resolution(intent 解析),首先 intent 会描述想要进行的操作,而 intentfilter可以来描述一个 activity 所能支持的操作。Intentfilter 在 AndroidManifest.xml 中定义。在 intent 描述了所要进行的操作之后,就会和 intentfilter 进行配对,而进行配对的是 action, data(uri & type)以及 category。

例如,如果一个app所能支持拨号操作,则它的 intentfilter 中就会包含 ACTION_DIAL;
如果能够支持地图操作,那它的 uri 中就会包含着 geo 元素。

另外要主要的是,如果一个app允许被隐式的 intent 启动,那么它的 intentfilter 中的 category 需要声明支持 android.intent.category.DEFAULT

permission

permission用来保护用户资源以及数据。比方说当一个app需要获取用户的通讯录时,这时就需要得到通讯录的权限。这些 permission 相关的定义在 AndroidManifest.xml 中。

  • 在使用权限时,使用 将所需要的权限写入

  • 在定义自己app的权限时,分为以下两步

    1. 使用 来定义权限
    2. 使用 android:permission="xxx" 来将所定义的权限和 activity 来联系在一起

fragment

fragment的生命周期

在开始阶段,调用如下所示

graph LR
onAttach-->onCreate;
onCreate-->onCreateView;
onCreateView-->onActivityCreated

在这之后,类似于activity,会有 onStart、onResume、onPause、onStop。在结束阶段,相应的依次调用:

graph LR
onDestroyView-->onDestroy;
onDestroy-->onDetach;

其中,onAttach()是将fragment与activity相关联,在onCreate中初始化框架,在onCreateView中才将框架可视化。在遇到配置变化时,activity与fragment都会销毁并且重新开始,如果在fragment的Oncreate()中加入了setRetainInstance(true)就可以保证fragment不被销毁而只有activity会被重启,这时,会与即将被销毁的activity调用detach();由于fragment不会被销毁,因此在配置变化之后fragment的onCreate()和onDestroy()方法也不会被调用。

将fragment添加至activity

有两种方式来将fragment添加到activity:

  1. 在activity的layout文件中静态的声明。

  2. 使用 fragmentManager在运行过程中加以声明,这一方法的好处是在于能够在交互过程中来动态的改变框架。这种方式分为以下四个步骤:

    1. 获得 fragmentManager 的引用: FragmentManager fragmentManager = getFragmentManager();
    2. 开始一个 fragmentTransaction: FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    3. 添加 fragment: fragmentTransaction.add(R.id.fragment_container, someFragment);
    4. 提交 fragmentTransaction: fragmentTransaction.commit();

当加载了一个fragment后,它将不会加入backstack,因此在点击返回键时可能会出现问题,因此可以用 addToBackStack() 来将其入栈;另外,executePendingTransaction()可以立刻更新fragment。

User interface

view的介绍:

  1. UI组件的重要组成部分
  2. 在屏幕上占据长方形的空间
  3. 负责画图以及处理事件

常用的控件:

  • Button: 按键
  • ToggleButton: 按键,在点击后保持按下的状态。例如音乐暂停与播放键的切换
  • checkbox
  • ratingBar: 评分
  • autoCompleteTextView: 文本框,带有联想功能

viewgroup:用来聚集一系列view控件

  • timepicker
  • radiopicker
  • datepicker
  • webview
  • mapview
  • adapterview
  • spinner

其中,adapter管理data并且给提供view给adapterview,而adapterview负责显示。

graph LR
Data-->Adapter;
Adapter-->Data;
Adapter-->AdapterView;
AdapterView-->Adapter;

在具体的代码实现中,Adapter里的 View getView(int position, View convertView, ViewGroup parent)用于处理显示的每一个数据。

posted @ 2017-07-24 21:09  myccc  阅读(311)  评论(0)    收藏  举报