activity详解

论坛 期权论坛 脚本     
已经匿名di用户   2022-4-26 15:53   1579   0

核心基础小专题【Activity】


Android四大组件

  • Activity
  • BroadcastReceiver 广播接收者
  • Service 服务
  • ContentProvider 内容提供者

Activity的继承关系

public class Activity extends ContextThemeWrapper implements ....

public class ContextThemeWrapper extends ContextWrapper

public class ContextWrapper extends Context

public abstract class Context

Activity的编写步骤:

  1. 写一个类继承 Activity
  2. 重写onCreate()方法
  3. 在清单文件的下面声明activity

    需要配置 布局文件 res/layout/... 
    需要设置布局文件  setContentView(R.layout.activity_main);
    

Activity相关

Activity生命周期

entire lifetime -->完整生命周期

onCreate() --> onStart() --> onResume() --> onPause() --> onStop() --> onDestroy()

visible lifetime -->可视化生命周期

onStart()-->onResume()-->onPause()-->onStop() --> onRestart();

foreground lifetime -->前台生命周期

onResume() --> onPause()

onRestart()调用过程

onStop() --> onRestart() --> onStart() 
  • onCreate()

    当activity被创建时调用的方法
    
  • onStart()

    在onCreate()方法之后调用,当用户看到界面的时候调用
    
  • onResume()

    在onStart()方法之后调用,当activity后去焦点的时候调用
    
  • onPause()

    当activity失去焦点的时候调用 --> activity还能看见,但是对于activity里面的点击事件都无效了
    
  • onStop()

    当activity界面不可见的时候调用
    
  • onDestroy()

    当activity被销毁的时候调用
    
  • onRestart()

    当用户按home键切换到桌面,然后再进入activity的时候 会调用
    

配置activity没有标题栏方法

  • 配置application的theme

    <item name="windowNoTitle">true</item>
    
  • 在自己写的activity的oncreate的方法里加入

    requestWindowFeature(Window.FEATURE_NO_TITLE);
    注意:这个方法要在setContentView之前调用,否则会报错
    

怎么创建一个activity界面

1.创建类继承Activity
2.在清单文件(AndroidManifest.xml)里面配置activity
3.实现类里的OnCreate的方法 -->这是Activity开启时调用的方法
4.在OnCreate方法里用 setContentView() -->指定activity显示的layout页面

怎么跳转一个Activity

直接开启

  1. 初始化显示意图,制定要跳转的Activity

    Intent intent = new Intent(上下文,myActivity.class);
    或者:
    Intent intent = new Intent();
    intent.setClass(上下文,myActivity.class);
    
  2. 如果有参数,用intent携带参数

    intent.putExtra(key,value); -->里面存放的格式有:数据基本类型,序列化对象,字节数组...
    如果对象 实现了 Parcelable接口 或者 Serializable接口,也可以通过intent来传递
    
  3. 调用startActivity 来跳转新页面

    上下文.startActivity(intent);
    
  4. 如果当前页面需要关闭,在当前页面调用finish方法

    上下文.finish();
    
  5. 跳转过去的页面要获取数据调用intent的get...方法

    注意:这里不能new一个intent,否则拿不到数据,要获跳转过来的intent,用getIntent来获取
    Intent intent = getIntent();
    intent.getXXXExtra();
    

利用startForResult来开启

  1. 初始化意图
  2. 如果有参数设置参数
  3. 调用startActivityForResult() 跳转页面

    startActivityForResult(intent,requestCode); 
    -->requestCode:请求码,设置大于和等于0的数字
    
  4. 在跳转的activity里实现回跳的逻辑

    Intent intent = new Intent();
    intent.putXXX(); -->根据业务需求是否需要携带参数
    setResult(resutlCode,intent);
    finish(); -->最后需要关闭当前页面
    
  5. 当前activity实现onActivityResult()方法 --> 这是回跳的时候执行的方法

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
          super.onActivityResult(requestCode, resultCode, data);
    }
    requestCode 是调用startActivityForResult时设置的requestCode
    resultCode 是回跳的activity设置的code
    data 是回跳时候携带的参数
    可能当前页面需要跳转的页面过多,这里可以用requestCode和resultCode去过滤
    

显示意图&隐式意图

  • 显示意图:必须指定打开的activity的类名或者路径名

应用场景-->适合自己应用程序内部使用,效率高

    例子:
    Intent intent = new Intent();
    intent.setClassName(应用程序包名, 要跳转的activity路径名);
    startActivity(intent);
  • 隐示意图:需要指定action(动作)和category,如果action相同,而内容不同,可以配置data来区分

应用场景-->适合应用程序之间调用,根据action在去遍历查找,效率低

例子:

    1.要跳转的activity在清单文件里增在intent-filter
    <intent-filter >
            <action android:name="自己定义,习惯用包名后加功能名"/>
            <category android:name="android.intent.category.DEFAULT"/> //默认
    </intent-filter>



    2.谁要跳转到这个activity,谁的方法里面调用
    Intent intent = new Intent();
    intent.setAction("要跳转的activity在清单文件里配置的action");
    intent.addCategory("android.intent.category.DEFAULT");-->默认
    startActivity(intent);

隐示意图需要注意的地方

  • 在清单文件的 intent-filter 里面还可以配置 data标签,data标签可以配置多个不同种类型的

    例如: 
    <data android:scheme="自己定义"/> -->设置前缀,与电话播放器调用很像
    <data android:mimeType="text/plain"/> -->定义类型,这里不能随意定义
    
  • 在java代码里

    如果配置了scheme和mineType:
    intent.setDataAndType(scheme,mimeType);
    
    
    如果只配置scheme:
    intent.setData();
    
    
    如果只配置了mimeType:
    intent.setType();
    

利用隐示意图激活系统应用

  1. 分析系统应用的清单文件里面定义的intent-filter
  2. 在java代码里根据intent-filter去设置
  3. 调用startActivity去激活

    例如:
    Intent intent = new Intent();
    intent.setAction("android.intent.action.VIEW");
    intent.addCategory("android.intent.category.DEFAULT");
    intent.addCategory("android.intent.category.BROWSABLE");
    intent.setData(Uri.parse("http://www.itheima.com"));
    startActivity(intent);
    

通过textView还有一种方式跳转网页

    tvName.setText(url);
    tvName.setAutoLinkMask(Linkify.ALL); -->用来匹配是否是个url连接
    tvName.setMovementMethod(LinkMovementMethod.getInstance()); 
    -->这个方法要是不设置,不会去跳转

Activity横竖屏切换

  • 在activity横竖屏切换的时候默认是销毁当前的activity,然后重新初始化activity

在清单文件里配置

    android:screenOrientation="portrait" 
    portrait-->一直是竖屏
    landspace --> 一直是横屏
    固定activity的显示模式,这样就不会重走一次生命周期

或者配置

    android:configChanges="keyboardHidden|screenSize|orientation"
    这样的话就算横竖屏切换了,不会影响activity,也就不会重走一次生命周期

任务栈

task stack

  • task --> 一个应用程序一般包括多个activity,每个activity都是用来和用户交互的任务
  • stack --> 栈是一种特殊的数据结构(后进先出),队列也是一种特殊的数据结构(先进先出)

    任务栈就是记录用户的操作的,记录activity打开的先后顺序,后开的activity先关闭,
    当栈里的activity全部关闭,应用就退出了
    

一个应用程序一般对应一个任务栈,在某种情况下也能对应多个栈

Activity启动模式

standard: 标准启动模式

特点:默认启动模式

singleTop:单一顶部模式

特点:如果activity已经被开启,而且是在栈顶,就不会在创建当前这个activity的实例,
而是复用这个已经开启的activity,但是如果不是在栈顶,就会初始化一个新的实例,
在整个栈里允许有多个实例
  • 应用场景:短信界面

singleTask:单一任务栈

    特点:当前栈里只允许有一个当前activity的实例,
    如果要开启的activity在栈里存在,并且在底部,就会移除这个activity上面所有的activity
  • 应用场景:如果这个activity非常消耗cpu和内存,建议把这个activity的启动模式设置为singleTask,浏览器的browserActivity 设置的就是

singleinstance:单一实例

    特点:整个手机操作系统只有一个实例,并且是单独运行在自己的任务栈里
  • 应用场景:通话界面的activity
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:81
帖子:4969
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP