Activity篇

App看到的界面就是activity,继承Activity类。

1.继承Activity类,重写OnCreate()

创建activity之后要重写OnCreate()方法,Android讲究逻辑和视图分离,布局文件在res目录中,逻辑实现在java目录中。

OnCreate()中添加setContentView(R.layout.main_layout);  显示布局文件。

2.在AndroidManifest.xml文件中注册

所有的活动在AndroidManifest.xml文件中注册才能生效。活动的注册声明放在<application>标签内,通过<activity>标签来对活动进行注册。name包括activity的包名和类名,一般根节点manifest标签会声明包名,因此,这里可以简略为.类名。label指定活动的标题栏内容,显示在活动的最顶部。注意主活动的label标签不仅会成为标题栏的内容,还会成为启动器中应用程序显示的名称。<intent-filter>标签中添加了actioncategory属性,主程序会加入下面两句声明。

<action android:name = "android.intent.action.main"/>

<category android:name ="android.intent.category.LAUNCHER"/>

3.隐藏标题栏

在OnCreate()方法中添加 requestWindowFeature(Window.FEATURE_NO_TITLE);

4.Toast

吐司,Toast.makeText(MainActivity.this,"jjjjj",Toast.LENGTH_SHORT).show;   show()丢了的话吐司就不会显示。

5.Menu

重写OnCreateOptionsMenu()方法,传入参数menu。getMenuInflater().inflate(R.menu.main,menu) 创建当前活动的的菜单。然后方法返回,true 表示显示菜单,false表示创建的菜单无法显示。重写OnOptionsItem Selected()方法,定义菜单的响应事件。一般用switch()

6.销毁活动

调用finish ()方法,就可以销毁活动了。效果和按下Back键是一样的。

7.活动间交互

Intent是Android中各组件交互的一种方式。不仅可以指明当前组件想要执行的动作,还可以在不同组件之间传递参数。Intent一般用于启动活动,启动服务,以及发送广播等。分为显式Intent和隐式Intent。每个Intent只有一个action,但可以有多个category。

1>显式Intent

Intent intent = new Intent(FirstActivity.this,SecondActivity.this);

startActivity(intent);

2>隐式Intent

隐式不明确指定启动哪个Activity,而是设置Action、Data、Category,让系统来筛选出合适的Activity。筛选是根据所有的<intent-filter>来筛选。

AndroidManifest.xml文件中,首先被调用的Activity要有一个带有<intent-filter>并且包含<action>的Activity,设定它能处理的Intent,并且category设为"android.intent.category.DEFAULT"。

action的name是一个字符串,可以自定义,例如我在这里设成"abcdefg":

复制代码
<activity  
    android:name=".SecondActivity">  
    <intent-filter>  
        <action android:name="com.example.activitytest.ACTION_START"/>  
        <category android:name="android.intent.category.DEFAULT"/>  
    </intent-filter>  
</activity>  
复制代码


然后,在MainActivity,才可以通过这个action name找到上面的Activity。

Intent intent = new Intent("com.example.activitytest.ACTION_START");  
startActivity(intent);  

或者添加默认的category

<activity  
    android:name=".SecondActivity">  
    <intent-filter>  
        <action android:name="com.example.activitytest.ACTION_START"/>  
        <category android:name="android.intent.category.DEFAULT"/>  
        <category android:name="com.example.activitytest.MY_CATEGORY"/>  
 
 
 </intent-filter>  
</activity>  

 
  
Intent intent = new Intent("com.example.activitytest.ACTION_START");  
intent.addCategory("com.example.activitytest.MY_CATEGORY");
startActivity(intent); 

8.活动间传递参数

1.传参:intent调用putExtra("extra","要穿的参数");

2.接收 intent.getStringExtra("extra");

3.返回数据:startActivityforResult(intent,1)

9.生命周期

返回栈

每个活动在其生命周期中最多可能会有四种状态。

1. 运行状态

当一个活动位于返回栈的栈顶时,这时活动就处于运行状态。系统最不愿意回收的 就是处于运行状态的活动,因为这会带来非常差的用户体验。

2. 暂停状态

当一个活动不再处于栈顶位置,但仍然可见时,这时活动就进入了暂停状态。你可 能会觉得既然活动已经不在栈顶了,还怎么会可见呢?这是因为并不是每一个活动都会 占满整个屏幕的,比如对话框形式的活动只会占用屏幕中间的部分区域,你很快就会在 后面看到这种活动。处于暂停状态的活动仍然是完全存活着的,系统也不愿意去回收这 种活动(因为它还是可见的,回收可见的东西都会在用户体验方面有不好的影响),只 有在内存极低的情况下,系统才会去考虑回收这种活动。

3. 停止状态

当一个活动不再处于栈顶位置,并且完全不可见的时候,就进入了停止状态。系统 仍然会为这种活动保存相应的状态和成员变量,但是这并不是完全可靠的,当其他地方 需要内存时,处于停止状态的活动有可能会被系统回收。 4. 销毁状态 当一个活动从返回栈中移除后就变成了销毁状态。系统会最倾向于回收处于这种状 态的活动,从而保证手机的内存充足。

10 活动的生存期

Activity类中定义了七个回调方法,覆盖了活动生命周期的每一个环节.

1. onCreate() 它会在活动 第一次被创建的时候调用。在这个方法中完成活动的初始化操作,比如说加载布局、绑定事件等。

2. onStart() 这个方法在活动由不可见变为可见的时候调用。

3. onResume() 这个方法在活动准备好和用户进行交互的时候调用。此时的活动一定位于返回栈的栈顶,并且处于运行状态。

4. onPause() 这个方法在系统准备去启动或者恢复另一个活动的时候调用。我们通常会在这个方法中将一些消耗 CPU的资源释放掉,以及保存一些关键数据,但这个方法的执行速度 一定要快,不然会影响到新的栈顶活动的使用。

5. onStop()这个方法在活动完全不可见的时候调用。它和 onPause()方法的主要区别在于,如果启动的新活动是一个对话框式的活动,那么 onPause()方法会得到执行,而 onStop() 方法并不会执行。

6. onDestroy() 这个方法在活动被销毁之前调用,之后活动的状态将变为销毁状态。

7. onRestart() 这个方法在活动由停止状态变为运行状态之前调用,也就是活动被重新启动了。

以上七个方法中除了 onRestart()方法,其他都是两两相对的,从而又可以将活动分为三种生存期。

1. 完整生存期

活动在 onCreate()方法和 onDestroy()方法之间所经历的,就是完整生存期。一般情 况下,一个活动会在 onCreate()方法中完成各种初始化操作,而在 onDestroy()方法中完 成释放内存的操作。

2. 可见生存期

活动在onStart()方法和 onStop()方法之间所经历的,就是可见生存期。在可见生存 期内,活动对于用户总是可见的,即便有可能无法和用户进行交互。可以通过这两个方法,合理地管理那些对用户可见的资源。比如在 onStart()方法中对资源进行加载, 而在onStop()方法中对资源进行释放,从而保证处于停止状态的活动不会占用过多内存。

3. 前台生存期

活动在 onResume()方法和 onPause()方法之间所经历的,就是前台生存期。在前台生存期内,活动总是处于运行状态的,此时的活动是可以和用户进行相互的,平时看到和接触最多的也这个状态下的活动。



11.活动被回收

在活动被回收之前使用onSaveInstanceState()回掉方法,解决活动被回收时临时数据得不到保存的问题。

12.活动的启动模式

启动模式一共有四种,分别是 standard、singleTop、 singleTask 和 singleInstance,可 以在 AndroidManifest.xml 中通 过给<activity>标签 指定 android:launchMode属性来选择启动模式。

standard是活动默认的启动模式,在不进行显式指定的情况下,所有活动都会自动使用这种启动模式。在 standard模式(即默认情况)下,每当启动一个新的活动,它就会在返回栈中入栈,并处于栈顶的位置。对于使用 standard模式的活动,系统不会在乎这个活动是否已经在返回栈中存在,每次启动都会创建该活动的一个新的实例。

 singleTop模式。当活动的启动模式指定为 singleTop,在启动活动时如果发现返回栈的栈顶已经是该活动,则认为可以直接使用 它,不会再创建新的活动实例。

singleTask 如果该活动并没有处于栈顶的位置,还是可能会创建多个活动实例的。这就要借助 singleTask模式来实现了。当活动的启动模式指定为 singleTask,每次启动该活动时系统首先会在返回栈中检查是否存在该活动的实例,如果发现已经存在则直接使用该实例,并把在这个活动之上的所有活动统统出栈,如果没有发现就会创建一个新的活动实例。

singleInstance模式应该算是四种启动模式中最特殊也最复杂的一个了。不同于以上三种启动模式,指定为 singleInstance模式的活动会启用一个新的返回栈来管理这个活动(其实如果 singleTask模式指定了不同的 taskAffinity,也会启动一个新的返回栈)。假设我们的程序中有一个活动是允许其他程序调用的,如果我们想实现其他程序和我们的程序可以共享这个活动的实例,应该如何实现呢?使用前面三种启动模式肯定是做不到的,因为每个应用程序都会有自己的返回栈,同一个活动在不同的返回栈中入栈时必然是创建了新的实例。而使用 singleInstance模式就可以解决这个问题,在这种模式下会有一个单独的返回栈来管理这个活 动,不管是哪个应用程序来访问这个活动,都共用的同一个返回栈,也就解决了共享活动实例的问题。

13 活动的最佳实践

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

Log.d("BaseActivity", getClass().getSimpleName());

2.随时随地退出程序

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

3.启动活动的最佳写法

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








猜你喜欢

转载自blog.csdn.net/ShaneneD/article/details/79991421