活动的最佳实践(知晓当前是在哪一个活动,随时随地退出程序,启动活动的最佳写法)

在正文之前,首先做好演示的准备工作。
1.首先建立一个项目,实现好图中文件的建立,代码会在接下来的实践中逐步讲解
这里写图片描述
2.然后在三个布局文件中分别添加一个Button,并分别一次命名为button1,button2,button3


一.知晓当前是在哪一个活动
这个技巧将教会你,如何根据程序当前的界面就能判断出这是哪一个活动。可能你会觉得挺纳闷的,我自己写的代码怎么会不知道这是哪一个活动呢?很不幸的是,在你真正进入到企业之后,更有可能的是接手一份别人写的代码,因为你刚进公司就正好有一个新项目启动的概率并不高。阅读别人的代码时有一个很头疼的问题,就是你需要在某个界面上修改一些非常简单的东西,但是你半天找不到这个界面对应的活动是哪一个。学会了本节的技巧之后,这对你来说就再也不是难题了。

1.将创建的BaseActivity 继承自Activity,然后在BaseActivity 中重写onCreate()方法,如下所示:

<code class="hljs java has-numbering"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">BaseActivity</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Activity</span> {</span>
    <span class="hljs-annotation">@Override</span>
    <span class="hljs-keyword">protected</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onCreate</span>(Bundle savedInstanceState) {
        <span class="hljs-keyword">super</span>.onCreate(savedInstanceState);
        Log.d(<span class="hljs-string">"BaseActivity"</span>, getClass().getSimpleName());
        <span class="hljs-comment">//我们在onCreate()方法中获取了当前实例的类名,并通过Log 打印了出来。</span>
    }
}</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li></ul>

2.然后让BaseActivity 成为FirstActivity、SecondActivity 和ThirdActivity 的父类。并分别在这些子类中实现:点击FirstActivity中按钮跳转到SecondActivity 的界面,点击SecondActivity 中的按钮跳转到ThirdActivity的界面。(具体代码就不贴出来了)

运行程序,然后通过点击按钮分别进入到FirstActivity、SecondActivity 和ThirdActivity 的界面,这时观察LogCat 中的打印信息,如下图所示:
这里写图片描述


二.随时随地退出程序
如果目前你手机的界面还停留在ThirdActivity,你会发现当前想退出程序是非常不方便的,需要连按三次Back 键才行。按Home 键只是把程序挂起,并没有退出程序。其实这个问题就足以引起你的思考,如果我们的程序需要一个注销或者退出的功能该怎么办呢?必须要有一个随时随地都能退出程序的方案才行。
其实解决思路也很简单,只需要用一个专门的集合类对所有的活动进行管理就可以了

下面我们就来实现一下:
1.建立一个类作为活动管理器,这里就选定ActivityCollector并实现下列代码:

<code class="hljs cs has-numbering"><span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> ActivityCollector {
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> List<Activity> activities = <span class="hljs-keyword">new</span> ArrayList<Activity>();

    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">addActivity</span>(Activity activity) {
        activities.add(activity);
    }

    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">removeActivity</span>(Activity activity) {
        activities.remove(activity);
    }

    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">finishAll</span>() {
        <span class="hljs-keyword">for</span> (Activity activity : activities) {
            <span class="hljs-keyword">if</span> (!activity.isFinishing()) {
                activity.finish();
            }
        }
    }
}</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li></ul>

在活动管理器中,我们通过一个List 来暂存活动,然后提供了一个addActivity()方法用于向List 中添加一个活动,提供了一个removeActivity()方法用于从List 中移除活动,最后提供了一个finishAll()方法用于将List 中存储的活动全部都销毁掉。
2.接下来修改BaseActivity 中的代码,如下所示:

<code class="hljs java has-numbering"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">BaseActivity</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Activity</span> {</span>
    <span class="hljs-annotation">@Override</span>
    <span class="hljs-keyword">protected</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onCreate</span>(Bundle savedInstanceState) {
        <span class="hljs-keyword">super</span>.onCreate(savedInstanceState);
        Log.d(<span class="hljs-string">"BaseActivity"</span>, getClass().getSimpleName());
        ActivityCollector.addActivity(<span class="hljs-keyword">this</span>);
    }

    <span class="hljs-annotation">@Override</span>
    <span class="hljs-keyword">protected</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onDestroy</span>() {
        <span class="hljs-keyword">super</span>.onDestroy();
        ActivityCollector.removeActivity(<span class="hljs-keyword">this</span>);
    }
}</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li></ul>

从此以后,不管你想在什么地方退出程序,只需要调用ActivityCollector.finishAll()方法就可以了。例如在ThirdActivity 界面想通过点击按钮直接退出程序,只需将代码改成如下所示:

<code class="hljs java has-numbering">    <span class="hljs-annotation">@Override</span>
    <span class="hljs-keyword">protected</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onCreate</span>(Bundle savedInstanceState) {
        <span class="hljs-keyword">super</span>.onCreate(savedInstanceState);
        setContentView(R.layout.activity_third);
        Button button3 = (Button) findViewById(R.id.button3);
        button3.setOnClickListener(<span class="hljs-keyword">new</span> OnClickListener() {
            <span class="hljs-annotation">@Override</span>
            <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onClick</span>(View v) {
                ActivityCollector.finishAll();
            }
        });
    }</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li></ul>

点击ThirdActivity中按钮,就会一次性退出当前所有的活动,不要再麻烦的一次又一次按返回键了。
当然你还可以在销毁所有活动的代码后面再加上杀掉当前进程的代码,以保证程序完全退出。


三.启动活动的最佳写法
启动活动的方法相信你已经非常熟悉了,首先通过Intent 构建出当前的“意图”,然后调用startActivity()或startActivityForResult()方法将活动启动起来,如果有数据需要从一个活动传递到另一个活动,也可以借助Intent 来完成。
假设SecondActivity 中需要用到两个非常重要的字符串参数,在启动SecondActivity 的时候必须要传递过来,那么我们很容易会写出如下代码:
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra(“param1”, “data1”);
intent.putExtra(“param2”, “data2”);
startActivity(intent);
这样写是完全正确的,不管是从语法上还是规范上,只是在真正的项目开发中经常会有对接的问题出现。比如SecondActivity 并不是由你开发的,但现在你负责的部分需要有启动SecondActivity 这个功能,而你却不清楚启动这个活动需要传递哪些数据。这时无非就有两种办法,一个是你自己去阅读SecondActivity 中的代码,二是询问负责编写SecondActivity的同事。你会不会觉得很麻烦呢?其实只需要换一种写法,就可以轻松解决掉上面的窘境。

修改SecondActivity 中的代码,在里面添加一个actionStart()方法,如下所示:

<code class="hljs cs has-numbering"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">actionStart</span>(Context context, String data1, String data2) {
   Intent intent = <span class="hljs-keyword">new</span> Intent(context,SecondActivity.class);
   intent.putExtra(<span class="hljs-string">"param1"</span>, data1);
   intent.putExtra(<span class="hljs-string">"param2"</span>, data2);
   context.startActivity(intent);
}</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li></ul>

我们在SecondActivity 中添加了一个actionStart()方法,在这个方法中完成了Intent 的构建,另外所有SecondActivity 中需要的数据都是通过actionStart()方法的参数传递过来的,然后把它们存储到Intent 中,最后调用startActivity()方法启动SecondActivity。
这样写的好处在哪里呢?最重要的一点就是一目了然,SecondActivity 所需要的数据全部都在方法参数中体现出来了,这样即使不用阅读SecondActivity 中的代码,或者询问负责编写SecondActivity 的同事,你也可以非常清晰地知道启动SecondActivity 需要传递哪些数据。另外,这样写还简化了启动活动的代码,现在只需要一行代码就可以启动SecondActivity,
如下所示:

<code class="hljs java has-numbering">button1.setOnClickListener(<span class="hljs-keyword">new</span> OnClickListener() {
   <span class="hljs-annotation">@Override</span>
   <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onClick</span>(View v) {
      SecondActivity.actionStart(FirstActivity.<span class="hljs-keyword">this</span>, <span class="hljs-string">"data1"</span>, <span class="hljs-string">"data2"</span>);
   }
});</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li></ul>

养成一个良好的习惯,给你编写的每个活动都添加类似的启动方法,这样不仅可以让启动活动变得非常简单,还可以节省不少你同事过来询问你的时间。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值