android四大组件之activity知识点最强总结

1.创建Activity

定义Activity

在AndroidManifest.xml的<application>节点中声明<activity>
 <activity
     android:name="com.itheima.intent.MainActivity"
     android:label="@string/title_activity_main" >
          //这两句可以指定手机home里所是否显示的程序图标
 </activity >

显式意图创建方式

1.构造函数,代码少
startActivity(new Intent( this,MainActivity.class));
2. 类名形式,灵活,可扩展性强
intent.setClassName(this, “cn.hunterliy.activity.NewActivity”);
3. 包名类名形式,可启动其他程序中的Activity
intent.setClassName(“cn.itcast.downloader”, “cn.hunterliy.downloader.MainActivity”);

创建Activity并传递数据

在意图对象中封装了一个Bundle对象,可以用来携带数据,在新Activity中可以获得意图对象以获取其中Bundle保存的数据

Intent intent = new Intent();
Bundle extras = new Bundle();
extras.putString("key", "value");
intent.putExtras(extras);
startActivity(intent);

创建Activity获取返回数据

1.使用startActivityForResult(Intent intent, int requestCode) 方法打开Activity
2.重写onActivityResult(int requestCode, int resultCode, Intent data) 方法
3. 新Activity中调用setResult(int resultCode, Intent data) 设置返回数据之后,关闭Activity就会调用onActivityResult方法

Intent intent = new Intent();
intent.putExtra("key", "value");
intent.setClassName(this, "cn.hunterliy.activity.NewActivity" );
startActivityForResult(intent,100);

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
       //设置返回数据之后,关闭Activity就会调用onActivityResult方法
}

隐式意图创建Activity

显式意图是指在创建意图时指定了组件,而隐式意图则不指定组件,通过动作、类型、数据匹配对应的组件,在清单文件中定义时需要定义才能被隐式意图启动, 中至少配置一个和一个,否则无法被启动, Intent对象中设置的action、category、data在必须全部包含才能启动,中的、、都可以配置多个,Intent对象中不用全部匹配,每样匹配一个即可启动, 如果一个意图可以匹配多个Activity,Android系统会提示选择

<activity
            android:name="com.itheima.intent.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

                  Intent intent = new Intent(this,SecondActivity.class);
                  intent.setAction( Intent.ACTION_APP_ERROR);
                  startActivity(intent);

2.生命周期

Acitivity三种存活状态

Active 运行:activity在最前端运行,处于屏幕前景(当前task的栈顶Activity处于Active状态),同一时刻只能有一个Activity处于Active状态。
Stopped 停止:activity不可见,完全被覆盖,但依然保持所有的状态和内存信息。
Paused 暂停:activity可见,但前端还有其他activity,处于背景画面画面状态,失去了焦点,但依然是活动状态。

Activity的生命周期可以分为三组

完整的生命周期 oncreate - onstart - onresume - onpause - onstop - ondestroy
可视生命周期 onstart - onresume - onpause - onstop - onstart - onresume
前台生命周期 onresume - onpause

各种状态之间通过下列的方法调用转换

onCreate:创建时调用,或者程序在暂停、停止状态下被杀死之后重新打开时也会调用。在activity第一次被创建的时候调用。这里是你做所有初始化设置的地方──创建视图、设置布局、绑定数据至列表等。如果曾经有状态记录(参阅后述Saving Activity State。),则调用此方法时会传入一个包含着此activity以前状态的包对象做为参数。

onDestroy:销毁时调用,在activity销毁前调用。这是activity接收的最后一个调用。这可能发生在activity结束(调用了它的 finish() 方法)或者因为系统需要空间所以临时的销毁了此acitivity的实例时。你可以用isFinishing() 方法来区分这两种情况。

onStart:当activity正要变得为用户所见时被调用,

onStop:进入停止状态,或者销毁时会调用,当activity不再为用户可见时调用此方法。这可能发生在它被销毁或者另一个activity(可能是现存的或者是新的)回到运行状态并覆盖了它。

onResume:onStart之后或者从暂停状态恢复时调用,从停止状态恢复时由于调用onStart,也会调用onResume,在activity开始与用户进行交互之前被调用。此时activity位于堆栈顶部,并接受用户输入。
onPause:进入暂停、停止状态,或者销毁时会调用,当系统将要启动另一个activity时调用。此方法主要用来将未保存的变化进行持久化,停止类似动画这样耗费CPU的动作等。这一切动作应该在短时间内完成,因为下一个activity必须等到此方法返回后才会继续。

onRestart:从停止状态恢复时调用,在activity执行onStop()停止后,在再次启动之前被调用。
总以onStart()继之。

保存信息相关方法

onSaveInstanceState:在Activity被动的摧毁或停止的时候调用,用于保存运行数据,可以将数据存在在Bundle中
onRestoreInstanceState:该方法在Activity被重新绘制的时候调用,例如改变屏幕方向,savedInstanceState为onSaveInstanceState保存的数据

横竖屏切换时候Activity的生命周期

1,高版本4.0以上 android:configChanges=”orientation|keyboardHidden|screenSize”
低版本4.0以下 android:configChanges=”orientation|keyboardHidden”
横竖屏切换的时候 不会重新执行生命周期的方法, 界面仍然会变化
2,android:screenOrientation=”landscape” 横竖屏切换界面 不再变化.
3、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次
4、设置Activity的android:configChanges=”orientation”时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次
5.设置activity的android:configChanges=”orientation|keyboardHidden”时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法

Activity的生命周期的总结

1,Activity运行时按下HOME键(跟被完全覆盖是一样的):onSaveInstanceState –> onPause –> onStop onRestart –>onStart—>onResume
2,Activity未被完全覆盖只是失去焦点:onPause—>onResume
3,当前Activity产生事件弹出Toast和AlertDialog的时候Activity的生命周期不会有改变

具体演示一个函数调用过程:

启动第一个Activity的时候:
第一次创建onCreate()–>Activity可见了onStart()–>Activity可以操作了onResume()。
点击第一个Activity上的按钮通过Intent跳到第二个Activity:
第一个Activity暂停 onPause()–>创建第二个ActivityonCreate()–>Activity可见 onStart()–>Activity可操作onResume()–>第一个Activity被第二个Activity完全遮盖 onStop()(如果调用了finish(),或者系统资源紧缺,则会被销毁onDestory())。
点击系统返回功能建,从第二个Activity回到第一个Activity :
第二个Activity暂停 onPause()–>第一个Activity重启动OnRestart()(并没有被销毁,如果销毁了则要创建 onCreate())–>第一个Activity可见onStart()–>第一个Activity可操作 onResume()–>第二个Activity被完全遮盖onStop()(如果调用了finish(),或者系统资源紧缺,则会被销毁 onDestory())。

3.启动模式

activity的任务栈的概念

activity task stack
activity stack
back stack 后退栈
在Android系统中我们创建的Acitivity是以栈的形式呈现的

Actvity的启动模式

在AndroidManifest.xml中的标签中可以配置android:launchMode属性,用来控制Actvity的启动模式

<activity
            android:launchMode="singleInstance"
            android:name="com.hunterliy.mode.A_Activity"
            android:label="14.A_Activity" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity
            android:launchMode="singleInstance"
            android:name="com.hunterliy.mode.B_Activity"
            android:label="14.B_Activity" >
        </activity>

Activity的四种启动加载模式

standard:就是intent将发送给新的实例,所以每次跳转都会生成新的activity。

singleTop:也是发送新的实例,但不同standard的一点是,在请求的Activity正好位于栈顶时(配置成singleTop的Activity),不会构造新的实例

singleTask:和后面的singleInstance都只创建一个实例,当intent到来,需要创建设置为singleTask的Activity的时候,系统会检查栈里面是否已经有该Activity的实例。如果有直接将intent发送给它。

singleInstance:首先说明一下task这个概念,Task可以认为是一个栈,可放入多个Activity。比如启动一个应用,那么Android就创建了一个Task,然后启动这个应用的入口Activity,那在它的界面上调用其他的Activity也只是在这个task里面。那如果在多个task中共享一个Activity的话怎么办呢。举个例来说,如果开启一个导游服务类的应用程序,里面有个Activity是开启GOOGLE地图的,当按下home键退回到主菜单又启动GOOGLE地图的应用时,显示的就是刚才的地图,实际上是同一个Activity,实际上这就引入了singleInstance。singleInstance模式就是将该Activity单独放入一个栈中,这样这个栈中只有这一个Activity,不同应用的intent都由这个Activity接收和展示,这样就做到了共享。当然前提是这些应用都没有被销毁,所以刚才是按下的HOME键,如果按下了返回键,则无效

standard:每次调用startActivity()启动时都会创建一个新的Activity放在栈顶
singleTop:启动Activity时,指定Activity不在栈顶就创建,如在栈顶,则不再创建
singleTask:如果启动的Activity不存在就创建,如果存在直接跳转到指定的Activity所在位置
singleInstance:如果启动的Activity不存在就创建,如果存在就将指定的Activity移动到栈顶

4. android 退出activity 的方式总结

在android中使用:[activityname].this.finish(); 只是退出了activity的堆栈中,要真正的退出程序在手机cpu中的运行,当应用不再使用时,通常需要关闭应用,可以使用以下三种方法关闭android应用:

  1. 使用killProcess()函数,首先获取当前进程的id,然后杀死该进程:
    android.os.Process.killProcess(android.os.Process.myPid());
    通过这种方式不能将应用程序完全杀死,并且他不会把当前应用应用的Activity的task任务栈清空

  2. 在activity的生命周期函数中添加如下的函数,强制关闭与该包有关联的一切执行:
    ActivityManager am = (ActivityManager)getSystemService (Context.ACTIVITY_SERVICE);
    am.restartPackage(“packagename”);
    或杀死 am.killBackgroundProcesses(info.getPackname());
    还需要在AndroidManifest.xml文件中加入如下的权限:
    此做法:只能杀死别人,不能杀死自己

  3. 终止当前正在运行的Java虚拟机,导致程序终止System.exit(0);
    不会把自己的应用程序杀死

而真正市场级应用则常用以下方法:

创建类app 继承Application
AndroidMainfest –>name –>app //声明该类为整个应用程序全局的实例

创建整个应用程序全局的实例
App.class:
ArrayList activities;

其他的Activity中:
public void onCreate(Bundle savedInstanceState) {
App app = (App) getApplication();//获取应用程序全局的实例引用
app.activities.add(this); //把当前Activity放入集合中
}

public void onDestory(){
App app = (App) getApplication();//获取应用程序全局的实例引用
app.activities.remove(this); //把当前Activity从集合中移除
}

安全退出:
在菜单退出按钮的事件中定义如下代码:
App app = (App) getApplication();
List activities = app.activities;
for(Activity act:activities){
act.finish();//显式结束
}

小结

以上就是对于activity的大部分知识点总结了,但是还会有遗漏,请谅解。同时也希望大家能根据这个总结查漏补缺一下。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值