Activity基础知识
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基础知识的更多相关文章
- APP测试入门篇之APP基础知识(001)
前言 最近两月比较多的事情混杂在一起,静不下心来写点东西,月初想发表一遍接口测试的总结,或者APP测试相关的内容,一晃就月底了,总结提炼一时半会也整不完.放几个早年总结内部培训PPT出来 ...
- Runloop基础知识
*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...
- Android UI -- 的基础知识。
在介绍基础知识之前先明确几个基本的概念 View 视图是所有可视组件的基类,所有的UI控件包括布局类都是从View派生出来的. ViewGroup ViewGroup是View的扩展,可以放置多个Vi ...
- 【Xamarin开发 Android 系列 4】 Android 基础知识
原文:[Xamarin开发 Android 系列 4] Android 基础知识 什么是Android? Android一词的本义指“机器人”,同时也是Google于2007年11月5日宣布的基于Li ...
- Android基础知识巩固:关于PendingIntent和广播
平时使用广播的场合比较多,但细节的东西,看过了也没有总结,以至于某些场合有小问题,还是要把原理和属性搞清楚才能运用自如. 其实也是自己比较懒,先看别人的blog,有个概念再去官网看英文的能好理解一些. ...
- Android中的一些基础知识(二)
这几天在回顾Android的基础知识,就把一些常见的知识点整理一下,以后忘了也可以翻出来看一看. 简单介绍一下Activity的生命周期 在API文档中对生命周期回调的函数描述的很详细,这里我只是翻译 ...
- linux内存基础知识和相关调优方案
内存是计算机中重要的部件之中的一个.它是与CPU进行沟通的桥梁. 计算机中全部程序的执行都是在内存中进行的.因此内存的性能对计算机的影响很大.内存作用是用于临时存放CPU中的运算数据,以及与硬盘等外部 ...
- Android基础知识(一)
前言 前言 从软件测试最终目的发现问题缺陷来看,Findyou比较认同一个观念,测试的能力大致可以划分成三个能力层次:发现问题.定位问题.预防问题.有机会探讨一下这个分类. 发现问题各种方式方法,比如 ...
- Android 应用基础知识和应用组件
应用基础知识 安装到设备后,每个 Android 应用都运行在自己的安全沙箱内: Android 操作系统是一种多用户 Linux 系统,其中的每个应用都是一个不同的用户: 默认情况下,系统会为每个应 ...
- APK反编译之一:基础知识—APK、Dalvik字节码和smali文件
refs: APK反编译之一:基础知识http://blog.csdn.net/lpohvbe/article/details/7981386 APK反编译之二:工具介绍http://blog.csd ...
随机推荐
- EBS 常用sql
1)查看请求挂在哪个状态下 SELECT fcpv.concurrent_program_name FROM fnd_request_groups frg, --请求组 fnd_request_gro ...
- Spring Boot 配置 Swagger(3.0.0 版本)
添加 Swagger 依赖 <!-- https://mvnrepository.com/artifact/io.springfox/springfox-boot-starter --> ...
- 【NPDP专项练习】第六章 市场研究
第六章 市场研究 1.VOC也叫客户心声,指的是. A 选择一个单一的投资组合项目,并保证所有项目都在策略内 B 利用迭代在专家组中形成共识的决策 C 通过人工"商店"引导潜在客户 ...
- 记录一次vue的报错
1.主要代码 <div class="hello-ezuikit-js" v-for="(item,index) in list"> <div ...
- 重试机制的实现(Guava Retry)
重试机制的实现 重试作用: 对于重试是有场景限制的,参数校验不合法.写操作等(要考虑写是否幂等)都不适合重试. 远程调用超时.网络突然中断可以重试.外部 RPC 调用,或者数据入库等操作,如果一次操作 ...
- select remove option safari 兼容
select 移除某一 option 的 javascript 公司用的代码是 var ddlPrimaryResource = document.getElementById(ddlPrimaryR ...
- debug 获取mybatis dao 连接的数据库
MapperProxy.invoke MapperMethod.execute 查看sqlSession .
- MogDB 学习笔记之 -- PITR恢复
# 概念描述## 背景信息当数据库崩溃或希望回退到数据库之前的某一状态时,MogDB的即时恢复功能(Point-In-Time Recovery,简称PITR)可以支持恢复到备份归档数据之后的任意时间 ...
- SSM项目
1.环境搭建 1.1 结构目录 1.2 配置逆向工程 1.2.1 pom.xml <?xml version="1.0" encoding="UTF-8" ...
- centos6.x配置虚拟主机名及域名hosts
我们在本地安装了centos或者虚拟主机上安装了centos,主机名称默认是localhost,这样我们可以使用localhost访问我们的主机,在终端命令里默认的是[root@localhost ~ ...