Activity

一、Activity是什么

Activity是一种可以包含用户界面的组件,主要用于和用户进行交互。一个应用程序可以包含零个或多个活动。

二、活动的基本用法

1. 手动创建活动

​ 打开android studio,在src/main/java目录下右键选择new -> Activity -> Empty Activity即可。默认情况下会勾选Generate a Layout File,即自动生成布局文件。

2. 创建和加载布局文件

​ 若步骤1中并未勾选默认创建布局文件,则在src/main/res目录下,右键选择new->Android Resources File,新建一个布局文件,并在相应的activity中,调用setContentView(R.id.资源文件名)方法设置为该activity的引用布局文件。

3. 在AndroidManifest文件中注册

注册代码示例:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.joygin.viewtest"> <application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<!--Activity注册代码-->
<!--name为被注册的activity名称,label为标题栏的名称,主Activity的标题栏名称还会成为应用程序名称-->
<activity android:name=".MainActivity" android:label="标题栏名称">
<!--意图过滤器-->
<intent-filter>
<!--配置该Activity为主Activity,即程序的最开始画面-->
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>

4. 在Activity中使用Menu

1、在res目录下创建一个名为menu的Directory,并在menu目录下右键new -> Menu resource file ,创建一个名为main的菜单布局文件

2、菜单布局文件中设置menu的内容,示例代码如下:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<!--id指定菜单项的唯一标识符,title指定菜单项的名称-->
<item android:id="@+id/add_item"
android:title="add" />
<item android:id="@+id/remove_item"
android:title="Remove"/>
</menu>

3、在对象的Activity源文件中,重写onCreateOptionsMenu()方法,示例代码如下:

//返回值为true,表示允许创建的菜单显示出来,返回false表示禁止显示。
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}

4、设置菜单项相应事件,重写activity中的onOptionsItemSelected()方法,示例代码如下:

@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getGroupId()){
case R.id.add_item:
Toast.makeText(this, "clicked add", Toast.LENGTH_SHORT).show();
break;
case R.id.remove_item:
Toast.makeText(this,"clicked remove",Toast.LENGTH_SHORT).show();
break;
default:;
}
return true;
}

5. 销毁Activity

按下系统的back键即可销毁Activity,如果要程序主动销毁Activity,需调用finish()方法。

示例代码:

//设置按钮btn1的监听事件,点击后关闭页面
btn1.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v){
finish();
}
});

三、Activity间的跳转和数据传递

1. Intent的作用

​ Intent是Android程序中各组件之间交互的一种重要方式,其作用主要有以下两点:

  • 用于不同组件之间传递数据
  • ntent用于启动Activity、Service、Broadcast等。
  • 用于启动其他应用程序。

2. Intent实现ativity间的跳转

显示Intent跳转

//在原activity调用
Intent intent = new Intent(上下文,目标Activity.class);//第一个参数为上下文,activity本身就是一个上下文,可以直接调用this
startActivity(intent);

隐式Intent跳转

AndroidManifest.xml文件中:

<!--假设目标Activity是SecondActivity,使用隐式intent跳转到Activity-->
<!--AndroidManifest.xml中配置SecondActivity-->
<activity android:name=".SecondActivity">
<intent-filter>
<!--只有同时匹配action和category的intent才能匹配到这个activity-->
<action android:name="com.example.activitytest.ACTION_START"/> <!--action只有一个,action名称自定义,一般为类的全限定路径-->
<!--category可以有多个,此为系统提供的默认category,activity调用时无需添加-->
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="com.example.activitytest.MY_CATEGORY"/><!--自定义的category-->
</intent-filter>
</activity>

调用方activity中:

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

3. 隐式Intent打开浏览器

Intent.setData(Uri uri):

​ 用于传递字符串数据,参数一般通过Uri.parse()方法解析产生。

​ 此方法对应配置文件中的<data 属性="属性值">标签。

​ 主要用于向系统程序的跳转,如浏览器传递地址,短信传递接受手机号码,电话传递接口手机号码。

流程:

  • 以Intent.ACTION_VIEW为参数新建一个Intent。
  • 调用intent.setData设置Uri。
  • 调用startActivity实现跳转。

示例代码

btn1.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v){
Intent intent = new Intent(Intent.ACTION_VIEW);.//Intent.ACTION_VIEW是Android系统内置的action
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);
}
});

4. Intent传递数据

方式:调用intent.putExtra方式设置数据进行传递。接受方通过getIntent()获取intent,再通过intent.get对象类型Extra("键")获取数据。

流程:

  • 新建Intent
  • 通过intent.putExtra("键" , 值 ) 方法设置数据
  • 接受方getIntent().get类型Extra("键")获取数据。

示例代码

//原activity传递数据
btn1.setOnClickListener(new OnClickListener(){
@Override
public void OnClick(View v){
String data = "Hello World";
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra("key",data)
startActivity(intent);
}
}); //目标activity接受数据
@Override
protected void OnCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.second_layout);
Intent intent = getIntent();
String data = intent.getStringExtra("key");
}

5. 返回数据到上一个Activity

方式:通过startActivityForResult(intent, requesCode)方法跳转到目标activity,目标activity调用setResult(resultCode , intent)方法设置数据,原activity再重写onActivityResult获取数据。

流程:

  • 原activity新建intent并通过startActivityForResult()跳转到目的activity。
  • 原activity重写onActivityResult方法获取数据。
  • 目标activity新建intent设置数据,再通过setResult(intent)设置数据。

示例代码:

//----------原activity
//设置按钮监听
btn1.setOnClickListener(new OnClickListener(){
@Override
public void OnClick(View v){
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
startActivityForResult(intent, 1);
}
}); //重写onActivityResult方法
@Override
protected void OnActivityResult(int requestCode, int resultCode, Intent data){
switch (requestCode){
case 1:
if(resultCode == 2){
String data = data.getStringExtra("key");
}
break;
default:
}
} //-----------目标activity
btn2.setOnClickListener(new OnClickListener(){
@Override
public void OnClick(View v){
Intent intent = new Intent();
intent.putExtra("key","Hello World");
setResult(2, intent);
finish();
}
});

requestCode和resultCode区别:

​ requestCode用于区分不同的请求,resultCode用于区分返回处理结果是否成功。

四、Activity的生命周期

1、返回栈

activity是保存在返回栈中的,activity显示时则位于栈顶,按下系统后退键则弹出任务栈。在此界面上再打开一个activity则将新activity压入栈。调用activity的finish()方法则弹出栈。

2、Activity状态

运行状态

当一个活动位于返回栈的栈顶时,该活动处于运行状态。

暂停状态

活动不再处于栈顶位置,但仍然可见。例如通过小窗模式打开新的activity,则原先的activity处于暂停状态。

停止状态

活动不再处于栈顶位置,并且完全不可见

销毁状态

活动从返回栈中移除后处于销毁状态。系统优先回收该类活动。

3、Activity的生命周期

生命周期涉及到的7个方法

onCreate():Activity第一次创建时调用。常在该方法中完成初始化操作,如加载布局,绑定事件等。

onStart():Activity由不可见变为可见时调用。

onResume():activity准备好和用户进行交互时调用,即重新回到返回栈顶时调用。

onPause():activity离开栈顶时。

onStop():activity变为完全不可见时调用。

onDestroy():activity被销毁前调用。

onRestart():活动由停止状态变为运行状态之前调用,在onStart()方法之前执行,首次创建时不执行。

注:除了onRestart()方法,其他方法都是两两相互对应的。

Activity生命周期划分为3种生命周期

完整生存期:从onCreate()到onDestroy()

可见生存期:onStart()到onStop()

前台生存期:onResume()到onPause()

五、Activity的启动模式

1. standard模式

使用standard模式的activity,不管返回栈中是否已经存在该activity,每次启动都会创建该activity的一个新的实例。

2.singleTop模式

启动activity时,如果发现返回栈的栈顶已经是该activity,则直接使用它,否新新建该activity的实例。

3.singleTask模式

指定为singleTask模式的activity,每次创建该activity会先检查返回栈中是否存在,如果存在,则将该activity上的所有activity都移除返回栈。否则会创建一个新的activity实例。

4.singleInstance模式

指定为singleInstance模式的activity会启用一个新的返回栈管理该活动。使用场景:该程序和其他程序一同使用共享该activity。

5. 设置Activity启动模式

在AndroidManifest.xml中,给标签指定 android:launchMode 属性来选择启动模式。

六、Activity使用技巧

1.获取当前页面的Activity名称

方式:

  • 创建一个基础Activity:BaseActivity。
  • 重写onCreate()方法。
  • 在该方法中使用Log.d("BaseActivity", getClass().getSimpleName());
  • 让新建的子类都继承BaseActvity。

2.随时随地退出程序

方式:

  • 建立ActivityCollector类作为活动管理器,在该类中建立一个静态变量,存储activity。
  • 实现addActivity(Activity activity)方法、removeActivity(Activity activity)方法、finishAll()方法。
  • 在先前的BaseActivity中,重写onCreate方法,加入ActivityCollector.addActivity(this)
  • 在先前的BaseActivity中,重写onDestroy方法,加入ActivityCollector.removeActivity(this)
  • 退出程序的按钮可调用 ActivityCollector.finishAll()结束程序。

ActivityCollector示例代码:

public class ActivityCollector{
public static List<Activity> activities = new ArrayList<>(); public static void addActivity(Activity activity){
activities.add(activity);
} public static void removeActivity(Activity activity){
activities.remove(activity);
} public static void finishAll(){
for(Activity activity : activities){
if(!activity.isFinishing()){
activity.finish();
}
}
activities.clear();
}
}

BaseActivity示例代码:

public class BaseActivity extends AppCompatActivity{

	@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
Log.d("BaseActivity", getClass().getSimpleName());
ActivityCollector.addActivity(this);
} @Override
protected void onDestroy(){
super.onDestroy();
ActivityCollector.removeActivity(this);
}
}

Activity基础知识的更多相关文章

  1. APP测试入门篇之APP基础知识(001)

    前言        最近两月比较多的事情混杂在一起,静不下心来写点东西,月初想发表一遍接口测试的总结,或者APP测试相关的内容,一晃就月底了,总结提炼一时半会也整不完.放几个早年总结内部培训PPT出来 ...

  2. Runloop基础知识

    *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...

  3. Android UI -- 的基础知识。

    在介绍基础知识之前先明确几个基本的概念 View 视图是所有可视组件的基类,所有的UI控件包括布局类都是从View派生出来的. ViewGroup ViewGroup是View的扩展,可以放置多个Vi ...

  4. 【Xamarin开发 Android 系列 4】 Android 基础知识

    原文:[Xamarin开发 Android 系列 4] Android 基础知识 什么是Android? Android一词的本义指“机器人”,同时也是Google于2007年11月5日宣布的基于Li ...

  5. Android基础知识巩固:关于PendingIntent和广播

    平时使用广播的场合比较多,但细节的东西,看过了也没有总结,以至于某些场合有小问题,还是要把原理和属性搞清楚才能运用自如. 其实也是自己比较懒,先看别人的blog,有个概念再去官网看英文的能好理解一些. ...

  6. Android中的一些基础知识(二)

    这几天在回顾Android的基础知识,就把一些常见的知识点整理一下,以后忘了也可以翻出来看一看. 简单介绍一下Activity的生命周期 在API文档中对生命周期回调的函数描述的很详细,这里我只是翻译 ...

  7. linux内存基础知识和相关调优方案

    内存是计算机中重要的部件之中的一个.它是与CPU进行沟通的桥梁. 计算机中全部程序的执行都是在内存中进行的.因此内存的性能对计算机的影响很大.内存作用是用于临时存放CPU中的运算数据,以及与硬盘等外部 ...

  8. Android基础知识(一)

    前言 前言 从软件测试最终目的发现问题缺陷来看,Findyou比较认同一个观念,测试的能力大致可以划分成三个能力层次:发现问题.定位问题.预防问题.有机会探讨一下这个分类. 发现问题各种方式方法,比如 ...

  9. Android 应用基础知识和应用组件

    应用基础知识 安装到设备后,每个 Android 应用都运行在自己的安全沙箱内: Android 操作系统是一种多用户 Linux 系统,其中的每个应用都是一个不同的用户: 默认情况下,系统会为每个应 ...

  10. APK反编译之一:基础知识—APK、Dalvik字节码和smali文件

    refs: APK反编译之一:基础知识http://blog.csdn.net/lpohvbe/article/details/7981386 APK反编译之二:工具介绍http://blog.csd ...

随机推荐

  1. chatGPT-meta抗衡版本

    chatGPT-meta抗衡版本 链接:https://mp.weixin.qq.com/s/MbZTfVgxx221Eo9pl1h80w 内置 git代码 LLaMA 项目地址:https://gi ...

  2. NSQ(7)-nsq存在的问题

    nsq存在的缺陷 部署的难度 ​ nsq提供了一种消费者端进行服务发现的模型,所以无需告诉消费者去哪寻找对于的主题(Topic)在哪个nsqd实例上. ​ 然而,它并没有提供一种方案去解决一个生产者应 ...

  3. openwrt 配置 单网卡多IP

    config interface 'wan0' option ifname 'eth1' option proto 'static' option nat '1' option mtu '1500' ...

  4. easyui combobox两种不同的数据加载方式

    1.通过http访问加载数据. $('#XXXId').combobox({ url: httpUrl, valueField: 'code', textField: 'name', });2.通过j ...

  5. JavaScript常用的8个数组去重实战源码

      JavaScript常用的8个数组去重实战源码 在我们学习和使用JavaScript的中,会经常使用到数组的去重,接下来的内容,来给大家分享一下,我们在开发过程中,常用到的数组去重方法,这些方法都 ...

  6. [*]Quadratic Residual Networks: A New Class of Neural Networks for Solving Forward and Inverse Problems in Physics Involving PDEs

    Accepted by SIAM International Conference on Data Mining (SDM21) 本文提出了二次残差网络,通过在应用激活函数之前,添加二次残差项到输入的 ...

  7. homebrew 安装node 切换node版本

    注意:如果之前使用brew install node安装过node,需要先执行brew unlink node来'解绑'node 1.查找可用的node版本 brew search node 2.安装 ...

  8. 当前工程中typescritpt依赖包与依赖包中依赖包类型不一致如何解决

    在开发中,遇到文件中引入webpack,但是webpack.ICompiler不一致的情况 //import webpack from 'webpack'; import webpackHot fro ...

  9. 1255. 得分最高的单词集合 (Hard)

    问题描述 1255. 得分最高的单词集合 (Hard) 你将会得到一份单词表 words,一个字母表 letters (可能会有重复字母),以及每个字母对应的得分情况表 score. 请你帮忙计算玩家 ...

  10. ASP.NET Core中使用日志组件NLog

    上一篇文章描述了如何在ASP.NET Core中使用Log4Net记录日志.本篇将使用另外一个组件NLog在ASP.NET Core中记录日志. 1.引入程序集 NLog.Web.AspNetCore ...