好久不写博客了,自上次写到现在已经一年多了,写这东西其实坚持下来就好了,将自己学的东西一点点写出来成为日后的积累查阅的资料。最近不是特别忙,抽点时间学学移动开发。

Android组件中常用的四大组件

1.Activity

2.Service服务

3.Content Provider内容提供者

4.BroadcastReceiver广播接收器

一、Activity

  大家第一眼看到这个东西的时候,肯定想问这是个什么东西?打开手机随便打开一个应用,看到的屏幕就是一个Activity,点击按钮进入另一屏幕,这也是一个Activity,一个Activity通常就是指一个单独的屏幕,你所见的按钮、输入框等就承载在Activity上,你可以把它看成web中的一个页面,WinForm中的一个Frame, wpf中的一个Window,它就是一个可以承载控件的容器将你界面上的布局呈现给你。

  1.Activity生命周期

    经典的生命周期图,不多做解释,清晰明了,图中也给出了Activity中的函数调用关系,这里我需要强调一下需要注意的地方。

      1.当一个界面被全部覆盖和部分覆盖所调用的函数式有所不同的,当前页面被遮盖一部分时,onStop()不会被调用,再次被激活时onStart()也不会被调用,从图上也可以看出有这条路径,当全部覆盖时,这两个函数才会被调用。

      2.另外需要注意的是最左边的那条线,当内存不足时,不处于激活状态的Activity可能会被回收掉,所以不处于激活状态的Activity需要注意保存当前页面的状态,以便在再次创建的时候恢复被杀死前的状态。状态保存我们需要重写public void onSaveInstanceState(Bundle outState) 将数据放入outState这个Bundle(看成Java中的Map,C#中的Dictionary,就是存放键值对)中,在onCreate的时候恢复即可。这一还有需要注意的一点:onSaveInstanceState()并不是永远都会调用。比如,当用户在一个activity上按返回时,就不会调用,因为用户此时明确知道这个activity是要被销毁的,并不期望下次它的样子跟现在一样。

  

  2.页面数据传递

    页面的数据传递离不开Intent,又是一个新奇的玩意,百度一下,中文翻译成意图,意图是个什么东西,感觉翻译的好生硬,完全就是英文字典中的翻译嘛,看下百度百科中的解释:

      Intent(意图)主要是解决Android应用的各项组件之间的通讯。

      Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用。因此,Intent在这里起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦。
  
    解释还算可以最起码看了大概知道它是干什么用的了,下面看下怎么用
    (1)传数据到新页面, Intent存放数据跟Bundle一模一样,他们继承自相同的接口(Parcelable, Cloneable)。如下代码,其中name是你自己定义的键值,value是要传递的数据,这里传递的数据只可以是基本数据类型和可序列化的类型,一般对象不可以传递。
  //传递页面
 Intent intent = new Intent();
intent.putExtra(name, value)
intent.setClass(this, Activity.class);//这里参数Activity是示例,需要替换成你要打开页面的名字
this.startActivity(intent);  //接收页面
  protected void onCreate(Bundle savedInstanceState){    //savedInstanceState.getString(key);
 
    //savedInstanceState.getInt(key);
 
    //savedInstanceState.getBundle(key);
}

    (2)获取其它页面的返回值,这个需要继承LoaderCallbacks<Cursor>接口,并重写onActivityResult函数,这个函数第三个参数就是我们需要获取数据的地方。

public class MainActivity extends Activity implements LoaderCallbacks<Cursor> {

  ......
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
   
    //获取其它页面返回值
    //intent.getBooleanArrayExtra(name)
  
    //intent.getBundleExtra(name)
  
    //intent.getStringExtra(name) 
    Uri uri = intent.getData(); 
}
}

    上面代码 Uri uri = intent.getData();这里调用一些系统页面时,数据会以Uri形式返回,例如:

        //获取音乐列表界面
     Intent intent = new Intent();
intent.setType("audio/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(intent, 22);      //获取相册界面
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(intent, 22);

  3.Activity之菜单

    当我们点击手机左下角的按钮时,界面底部一般会弹出一个菜单,这个菜单可以从xml创建,也可以从代码创建,以下是实现代码:

    // 创建菜单处理
@Override
public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); // 从xml创建菜单
// getMenuInflater().inflate(R.menu.main, menu);
/**
* add()方法的四个参数,依次是:
* 1、组别,如果不分组的话就写Menu.NONE,
* 2、Id,这个很重要,Android根据这个Id来确定不同的菜单
* 3、顺序,那个菜单现在在前面由这个参数的大小决定
* 4、文本,菜单的显示文本
*/ menu.add(Menu.NONE, MenuIds.PlayOrPause, 1, MenuTitles.Play);
menu.add(Menu.NONE, MenuIds.EditMusic, 2, MenuTitles.EditMusic);
menu.add(Menu.NONE, MenuIds.EditImages, 3, MenuTitles.EditImages);
return true;
}

这里的Id跟title使用内部类定义的常量,这里贴出来可以作为参考:

    // 定义菜单id
private static class MenuIds {
public static final int PlayOrPause = Menu.FIRST + 1;
public static final int EditMusic = Menu.FIRST + 2;
public static final int EditImages = Menu.FIRST + 3;
} // 定义菜单显示文本
private static class MenuTitles {
public static final CharSequence Play = "播放";
public static final CharSequence Pause = "暂停";
public static final CharSequence EditMusic = "编辑音乐";
public static final CharSequence EditImages = "编辑照片";
}

这样就可以在按下左下角按键时,在底部出现系统菜单,还有一步需要做,就是点击菜单时的事件处理:

    // 菜单项被选择事件
@Override
public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) {
case MenuIds.PlayOrPause:
if (isPalying) {
Pause();
} else {
Play();
}
break;
case MenuIds.EditImages:
EditImages();
break;
case MenuIds.EditMusic:
EditMusic();
break;
}
return true;
}

另外还有几个可以能会用到的菜单事件:

    // 创建菜单前对菜单进行处理
@Override
public boolean onPrepareOptionsMenu(Menu menu) { MenuItem playOrPause = menu.findItem(MenuIds.PlayOrPause);
if (isPalying) {
playOrPause.setTitle("暂停");
// playOrPause.setIcon(R.drawable.pause);
} else {
playOrPause.setTitle("播放");
// playOrPause.setIcon(R.drawable.play);
}
// 如果返回false,onCreateOptionsMenu方法将不会被调用
return true;
} // 菜单关闭时触发
// 选项菜单被关闭事件,菜单被关闭有三种情形,
// menu按钮被再次点击、back按钮被点击或者用户选择了某一个菜单项
@Override
public void onOptionsMenuClosed(Menu menu) { }

4.Activity之布局

  做界面,不对界面控件了解的炉火纯青,上起手来还是会力不从心,事半功倍,做不出想要的效果。

  Android布局类型主要有四种,分别是LinearLayout(线性布局)、RelativeLayout(相对布局)、TableLayout(表格布局)、FrameLayout(帧布局)。

虽然这里名字基本可以见名知义,不动动手做做,心里还是没有底。

  这里网上搜到篇文章,解释用法已经很清楚了,借用一下:http://blog.csdn.net/wyd458549392147/article/details/7051417

Android学习(一) - Activity的更多相关文章

  1. Android学习笔记——Activity的启动和创建

    http://www.cnblogs.com/bastard/archive/2012/04/07/2436262.html Android Activity学习笔记——Activity的启动和创建 ...

  2. Android学习总结——Activity之间传递参数

    核心内容:一.在 Activity 之间传递简单数据二.在 Activity 之间传递复杂数据 三.在 Activity 之间传递自定义值对象   软件环境:Android Studio   一.在 ...

  3. android学习之activity

    Activity 的生命周期 和 J2ME 的 MIDlet 一样,在 android 中,Activity 的生命周期交给系统统一管理.与 MIDlet 不同的是安装在 android 中的所有的 ...

  4. Android学习之Activity初步

    Activity作为Android的第一步接触的概念,在学习中将初步的认识总结下来,以便后续的回顾与反思. 1.在用Android Studio生成第一个helloworld应用程序运行在手机上时,发 ...

  5. Android学习总结——Activity状态保存和恢复

    Android中启动一个Activity如果点击Home键该Activity是不会被销毁的,但是当进行某些操作时某些数据就会丢失,如下: Java class: package com.king.ac ...

  6. android学习四---Activity和Intent

    1.android项目资源深入了解 在深入学习android之前,先好好玩玩手机上的应用,大部分程序都有一个图标,点开图标,程序启动,一定时间后,程序会跳转到第一个界面,比如手机QQ,点开图标,会跳出 ...

  7. android学习笔记 activity生命周期&任务栈&activity启动模式

    activity生命周期 完整生命周期 oncreate->onstart->onresume->onpause->onstop->ondestory 使用场景:应用程序 ...

  8. Android学习路-activity活动

    activity即活动,是一种包含用户界面的组件,用于与用户进行交换   创建activity类 1.类继承Activity, activity传递一个bundle对象,可以获得onSaveInsta ...

  9. Android学习之Activity之间的数据传递

    Activity与Activity之间很多情况下都需要进行数据的传递,下面就用几个简单的例子来看一下. (一).一个Activity启动另一个Activity并将数据传递到这个Activity当中 思 ...

随机推荐

  1. activemq p2p方式

    package ch02.chat; import java.io.Serializable; import javax.jms.Connection; import javax.jms.Connec ...

  2. 浅谈 Python 的 with 语句

    with 语句是在 Python 2.5 版本引入的,从 2.6 版本开始成为缺省的功能.with 语句作为 try/finally 编码范式的一种替代,用于对资源访问进行控制的场合.本章对 with ...

  3. [转载] Zookeeper中的 ACL(Access Control List)访问控制列表

    zk做为分布式架构中的重要中间件,通常会在上面以节点的方式存储一些关键信息,默认情况下,所有应用都可以读写任何节点,在复杂的应用中,这不太安全,ZK通过ACL机制来解决访问权限问题,详见官网文档:ht ...

  4. jqgrid使用sql row_number进行分页

    背景 系统中使用了jqgrid的展示,现在要处理10w+的数据量 现状 使用了全查询的,查询到了10w+的数据放到了datatable中,每次页面刷新需要9秒多,并且传递给另一个dll来处理一些事情. ...

  5. Redis+MongoDB 最佳实践 做到读写分离 -摘自网络

    方案1. (被否定) 加上Redis,做到MongoDB的读写分离,单一进程从MongoDB及时把任务同步到Redis中. 看起来很完美,但是上线后出现了各种各样的问题,列举一下: 1.Redis队列 ...

  6. FZU 2176 easy problem (DFS序+树状数组)

    对于一颗树,dfs遍历为每个节点标号,在进入一个树是标号和在遍历完这个树的子树后标号,那么子树所有的标号都在这两个数之间,是一个连续的区间.(好神奇~~~) 这样每次操作一个结点的子树时,在每个点的开 ...

  7. php获取post中的json数据的实现方法

    最近用到腾讯微博与PHP交互,腾讯把json数据post给PHP(腾讯推送数据时,每条数据是一个json格式的数据包,作为post的数据体(请注意post数据体没有参数,不是key=value形式,整 ...

  8. Android模拟器访问本地的apache tomcat服务

    1. 在官网http://tomcat.apache.org/上下载tomcat,根据自己的电脑下载相应的文件 2.将apache-tomcat-6.0.37-windows-x64.zip包解压到本 ...

  9. 发布maven的web项目,tomcat显示已启动,但是访问出错

    sts中如果是maven的web工程,一定要先进行maven install,再发布工程,否则不会出任何错误,tomcat还访问不了

  10. 【Stage3D学习笔记续】山寨Starling(五):纹理计算和尺寸计算

    尺寸计算: Starling中的尺寸是以像素为单位的,这一切都得力于我们使用的正交矩阵,还记得我们顶点数据中的位置数据么,如果我们提交的矩形的四个顶点为(0, 0)(0, 100)(100, 0)(1 ...