活动的最佳实践

   1.知晓当前是在哪一个活动

        这个技巧将教会你,如何根据程序当前的界面就能判断出这是哪一个活动。

  •  首先需要新建一个 BaseActivity 继承自 Activity,然后在 BaseActivity中重写 onCreate()方法。
    1. public class BaseActivity extends Activity {
    2.  
    3. @Override
    4.  
    5. protected void onCreate(Bundle savedInstanceState) {
    6.  
    7. //在 onCreate()方法中获取了当前实例的类名,并通过 Log打印了出来。
    8.  
    9. super.onCreate(savedInstanceState);
    10.  
    11. Log.d("BaseActivity", getClass().getSimpleName());
    12.  
    13. }
    14.  
    15. }

    接下来我们需要让 BaseActivity 成为 ActivityTest 项目中所有活动的父类修改 FirstActivity、SecondActivity和 ThirdActivity的继承结构,让它们不再继承自 Activity,而是 继承自 BaseActivity。现在重新运行程序,然后通过点击按钮分别进入到 FirstActivity、SecondActivity 和 ThirdActivity的界面,这时该活动的类名就会被打印出来,     这样我们就可以 时时刻刻知晓当前界面对应的是哪一个活动了,观察logcat中的打印信息就可以时时刻刻知晓当前界面对应的是哪一个活动了。

  •   2.随时随地退出程序

  •             你会发现当前想退出程序是非常不方便 的,需要连按三次 Back 键才行,该方法可以解决这个问题。

           解决思路:

                 只需要用一个专门的集合类对所有的活动进行管理就可以了,

    •       新建一个 ActivityCollector类作为活动管理器

      1. public class ActivityCollector {
      2.  
      3. //,我们通过一个 List来暂存活动,
      4.  
      5. public static List<Activity> activities = new ArrayList<Activity>();
      6.  
      7. //然后提供了一个 addActivity()方法用 于向 List 中添加一个活动
      8.  
      9. public static void addActivity(Activity activity) {
      10.  
      11. activities.add(activity);
      12.  
      13. }
      14. //提供了一个 removeActivity()方法用于从 List 中移除活动。
      15. public static void removeActivity(Activity activity) {
      16.  
      17. activities.remove(activity);
      18.  
      19. }
      20. //最后 提供了一个 finishAll()方法用于将 List中存储的活动全部都销毁掉。
      21. public static void finishAll() {
      22.  
      23. for (Activity activity : activities) {
      24.  
      25. if (!activity.isFinishing()) {
      26.  
      27. activity.finish();
      28.  
      29. }
      30.  
      31. }
      32.  
      33. }
      34. }
      •   修改 BaseActivity中的代码

        1. public class BaseActivity extends Activity {
        2.  
        3. @Override
        4.  
        5. protected void onCreate(Bundle savedInstanceState) {
        6.  
        7. super.onCreate(savedInstanceState);
        8.  
        9. Log.d("BaseActivity", getClass().getSimpleName());
        10.  
        11. //调用了 ActivityCollector 的 addActivity()方法,表明 将当前正在创建的活动添加到活动管理器里
        12.  
        13. ActivityCollector.addActivity(this);
        14.  
        15. }
        16.  
        17. @Override
        18.  
        19. //重写 onDestroy()方法, 并调用了 ActivityCollector 的 removeActivity()方法,表明将一个马上要销毁的活动从活动管 理器里移除。
        20.  
        21. protected void onDestroy() {
        22.  
        23. super.onDestroy();
        24.  
        25. ActivityCollector.removeActivity(this);
        26.  
        27. }
        28.  
        29. }

             从此以后,不管你想在什么地方退出程序,只需要调用 ActivityCollector.finishAll()方法 就可以了.

        1. Button button3 = (Button) findViewById(R.id.button_3);
        2.  
        3. button3.setOnClickListener(new OnClickListener() {
        4.  
        5. @Override
        6.  
        7. public void onClick(View v) {
        8.  
        9. //调用 ActivityCollector.finishAll()方法
        10.  
        11. ActivityCollector.finishAll();
        12.  
        13. }
        14.  
        15. });

        3.启动活动的最佳写法

        • 启动 SecondActivity传递字符串参数最佳写法。

          1. public class SecondActivity extends BaseActivity {
          2.  
          3. /*所有 SecondActivity中需要的数据都是通过 actionStart()方法的参数传递过来的,然 后把它们存储到 Intent中,最后调用 startActivity()方法启动 SecondActivity。*/
          4.  
          5. public static void actionStart(Context context, String data1, String data2) {
          6.  
          7. Intent intent = new Intent(context, SecondActivity.class);
          8.  
          9. intent.putExtra("param1", data1);
          10.  
          11. intent.putExtra("param2", data2);
          12.  
          13. context.startActivity(intent);
          14.  
          15. } ……
          16.  
          17. }

            这样写是一目了然,SecondActivity 所需要的数据全 部都在方法参数中体现出来了.

          •    现在只需要一行代码就可以启动 SecondActivity

            1. button1.setOnClickListener(new OnClickListener() {
            2.  
            3. @Override
            4.  
            5. public void onClick(View v) {
            6.  
            7. //传入参数
            8.  
            9. SecondActivity.actionStart(FirstActivity.this, "data1", "data2");
            10.  
            11. }
            12.  
            13. });

(Android第一行代码实验一)活动的最佳实践的更多相关文章

  1. 《Android第一行代码》笔记

    学习Android开发差点儿相同有两年时间了.期间也做了大大小小的一些项目.近来抽出闲暇想把Android基础强化一下,之前在网上看到了郭霖郭大神的几篇博客.从中受益不少.于是花了近一周时间看完了郭神 ...

  2. Android 第一行代码(第二版)分享

    今天从网上好不容易看到了别人转发的pdf版的 第一行代码通过下载我把它存在了百度云里面了与大家共享 http://pan.baidu.com/s/1bRztF4

  3. android第一行代码-3.activity之间的调用跟数据传递

    前面两节所有应用都是同一个activity中的,是时候讲activity之间交互的操作了,此后会涉及到intent这个概念,这也算一个新的里程碑开始. 主要内容包括intent的使用,以及activi ...

  4. 1.3.4分析你的第一个Android程序——Android第一行代码(第二版)笔记

    切换项目结构模式 Project模式的项目结构 我们将项目切换成Project模式,这就是真实的目录结构. .gradle和.idea 这两个目下放置的都是Android Studio自动生成的一些文 ...

  5. android第一行代码-6.自定义控件的实现

    0.假设一个应用中标题栏控件都是共用的,如果每个activity都需要设置button,绑定方法,那代码就会很臃肿.那我们可以自定义控件,然后继承这个控件就行了. 自定义控件为TitleLayout, ...

  6. android第一行代码-2.activity基本用法

    摘要: 本节主要涉及到的有activity的创建,标题栏隐藏,button绑定方法(toast的使用),menu使用,活动销毁 1.activity的创建跟注册 创建: public class Te ...

  7. Android 第一行代码

    ::-/stuapplication.pla.edu.cn.fragmentbestpractice W/dalvikvm﹕ VFY: unable to find class referenced ...

  8. alexkn android第一行代码-8.sqlite使用

    Android自带sqlite数据库,因此常见操作应该都掌握.包括数据库的创建/升级以及增删改查. 1.创建数据库 public class MyDatabaseHelper extends SQLi ...

  9. android第一行代码-1.项目结构

    0.项目结构 一个简单的android项目结构大致如下 入口就是MainActivity这个类,如果对于一个陌生的项目,最好的办法是看AndroidMainifest.xml,如下 <?xml ...

随机推荐

  1. mysql安装和初次密码修改

    下载 第一步:打开网址,https://www.mysql.com,点击downloads之后跳转到https://www.mysql.com/downloads 第二步 :跳转至网址https:// ...

  2. Linux c读取系统内存使用信息

    系统的内存使用信息能够在虚拟文件系统/proc/meminfo中找到,如图 所以只要打开/proc/meminfo文件,然后从中读取信息就好了 #include <stdio.h>#inc ...

  3. unity中将多张图片进行椭圆运动

    GameObject canvas; ; ; ; ; Dictionary<int,GO> storeItem; GameObject main; public static bool r ...

  4. jsp请求转发与重定向区别小结

    1.当使用转发时,JSP容器将使用一个内部方法来调用目标页面,新的页面继续处理同一个请求,而浏览器不会知道这个过程; 2.重定向是第一个页面通知浏览器发送一个新的页面请求. 3.转发不改变URL,重定 ...

  5. 使用Python爬取代理ip

    本文主要代码用于有代理网站http://www.kuaidaili.com/free/intr中的代理ip爬取,爬虫使用过程中需要输入含有代理ip的网页链接. 测试ip是否可以用 import tel ...

  6. 近期面试总结(Android)

    关于近期面试总结(2018年下半年) 有些是老生常谈有些是没有遇到的. 1.HTTP和HTTPS的区别 HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全,为 ...

  7. python 参数传递 传值还是传引用

    个人推测结论: 可变对象传引用,不可变对象传值 python里的变量不同于c中地址储值模型 a=100 b=100 print(id(a),id(b),a==b,a is b) #8790877986 ...

  8. 2018年4月中旬的PTA(三)

    C高级第三次PTA作业(1) 题目6-1 输出月份英文名 1.设计思路 (1)算法(子函数) 第一步:定义字符型一级指针子函数名getmonth,形参整型n. 第二步:定义长度为12的字符数组指针mo ...

  9. Go语言for循环语句

    for循环语句解释与使用 首先我们定义sum:=0 格式:for i:=1;i<=100;i++{ sum+=i } for 循环100次,首先执行i=1,然后判断i<100,再执行sum ...

  10. 作用域&&闭包

    在了解闭包之前,先了解作用域一,作用域简单来说就是变量和函数可以访问的范围,在es5中变量作用域一般分为全局作用域和局部作用域,这个主要依据是全局变量还是局部变量 情景1: <script> ...