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. EBS 常用sql

    1)查看请求挂在哪个状态下 SELECT fcpv.concurrent_program_name FROM fnd_request_groups frg, --请求组 fnd_request_gro ...

  2. Spring Boot 配置 Swagger(3.0.0 版本)

    添加 Swagger 依赖 <!-- https://mvnrepository.com/artifact/io.springfox/springfox-boot-starter --> ...

  3. 【NPDP专项练习】第六章 市场研究

    第六章 市场研究 1.VOC也叫客户心声,指的是. A 选择一个单一的投资组合项目,并保证所有项目都在策略内 B 利用迭代在专家组中形成共识的决策 C 通过人工"商店"引导潜在客户 ...

  4. 记录一次vue的报错

    1.主要代码 <div class="hello-ezuikit-js" v-for="(item,index) in list"> <div ...

  5. 重试机制的实现(Guava Retry)

    重试机制的实现 重试作用: 对于重试是有场景限制的,参数校验不合法.写操作等(要考虑写是否幂等)都不适合重试. 远程调用超时.网络突然中断可以重试.外部 RPC 调用,或者数据入库等操作,如果一次操作 ...

  6. select remove option safari 兼容

    select 移除某一 option 的 javascript 公司用的代码是 var ddlPrimaryResource = document.getElementById(ddlPrimaryR ...

  7. debug 获取mybatis dao 连接的数据库

    MapperProxy.invoke MapperMethod.execute 查看sqlSession .

  8. MogDB 学习笔记之 -- PITR恢复

    # 概念描述## 背景信息当数据库崩溃或希望回退到数据库之前的某一状态时,MogDB的即时恢复功能(Point-In-Time Recovery,简称PITR)可以支持恢复到备份归档数据之后的任意时间 ...

  9. SSM项目

    1.环境搭建 1.1 结构目录 1.2 配置逆向工程 1.2.1 pom.xml <?xml version="1.0" encoding="UTF-8" ...

  10. centos6.x配置虚拟主机名及域名hosts

    我们在本地安装了centos或者虚拟主机上安装了centos,主机名称默认是localhost,这样我们可以使用localhost访问我们的主机,在终端命令里默认的是[root@localhost ~ ...