技术标签: android
目录
方法名称 | 方法作用 |
onCreate | 表示Activity已经被创建,一般在这个方法中做一些初始化的工作,比如调用setContentView去加载布局资源或者初始化Activity所需的数据。 |
onStart | 表示Activty已经被启动,已经可见,但是此时还处于后台,不能与用户进行交互。 |
onResume | 表示Activty已经被启动,已经可见,但是此时还处于后台,不能与用户进行交互 |
onPause | 当前Activity被其他活动的Activity覆盖时或锁屏时调用 |
onStop | 在Activity对用户不可见时调用 |
onDestory | 在Activity被销毁时调用;注意:在使用手机时会根据不同情况进行横竖屏切换。当手机横竖屏切换时,会根据清单文件AndroidManifest.xml文件中的configChanges属性不同而调用不同的生命周期
在使用默认属性时,调用的方法顺序依次时:onCreate,onStart,onResume
当进行横竖屏切换时,调用的方法依次时:onPause,onStop,onDestory,onCreate,onStart,onResume |
onRestart | 当从新启动的Activity返回原来的Activity时,原来的Activity会调用此方法。表示Activity正在重新启动。 |
众所周知当我们多次启动同一个Activity时,系统会创建多个实例,并把它们按照先进后出的原则一一放入任务栈中,当我们按back键时,就会有一个activity从任务栈顶移除,重复下去,直到任务栈为空,系统就会回收这个任务栈。但是这样以来,系统多次启动同一个Activity时就会重复创建多个实例,这种做法显然不合理,为了能够优化这个问题,Android提供四种启动模式来修改系统这一默认行为。
启动模式 | 作用 | 设置 |
standard | 这个模式是默认的启动模式,即标准模式,在不指定启动模式的前提下,系统默认使用该模式启动Activity,每次启动一个Activity都会重写创建一个新的实例,不管这个实例存不存在,这种模式下,谁启动了该模式的Activity,该Activity就属于启动它的Activity的任务栈中。这个Activity它的onCreate(),onStart(),onResume()方法都会被调用。 |
|
singleTop | 这个模式下,如果新的activity已经位于栈顶,那么这个Activity不会被重写创建,同时它的onNewIntent方法会被调用,通过此方法的参数我们可以去除当前请求的信息。如果栈顶不存在该Activity的实例,则情况与standard模式相同。需要注意的是这个Activity它的onCreate(),onStart()方法不会被调用,因为它并没有发生改变。 |
|
singleTask | 这个模式十分复杂,有各式各样的组合。在这个模式下,如果栈中存在这个Activity的实例就会复用这个Activity,不管它是否位于栈顶,复用时,会将它上面的Activity全部出栈,并且会回调该实例的onNewIntent方法。其实这个过程还存在一个任务栈的匹配,因为这个模式启动时,会在自己需要的任务栈中寻找实例,这个任务栈就是通过taskAffinity属性指定。如果这个任务栈不存在,则会创建这个任务栈。 |
|
singleInstance | 该模式具备singleTask模式的所有特性外,与它的区别就是,这种模式下的Activity会单独占用一个Task栈,具有全局唯一性,即整个系统中就这么一个实例,由于栈内复用的特性,后续的请求均不会创建新的Activity实例,除非这个特殊的任务栈被销毁了。以singleInstance模式启动的Activity在整个系统中是单例的,如果在启动这样的Activiyt时,已经存在了一个实例,那么会把它所在的任务调度到前台,重用这个实例。 |
|
在Android系统中,每个应用程序通常都是由许多个界面组成,每个界面就是一个Activity,在这些界面进行跳转时,实际上也就是Activity之间的跳转,Activity之间的跳转需要使用到Intent组件
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 创建intent对象,参数1是当前activity的引用,参数2是要跳转的activity的类型
Intent intent=new Intent(this,OtherActivity.class);
// 跳转
this.startActivity(intent);
}
}
隐式意图相比显式意图来说更为抽象,它并没有明确指定要开启那个控件,而是通过action和category等属性信息,系统根据这些信息来进行分析,然后寻找目标
一般我么可以通过设置Intent组件的action属性,来打开android内置的一些软件,例如:相机,浏览器,等等
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent=new Intent();
// 设置action动作,该动作要和清单文件中设置的一样
intent.setAction("android.intent.action.MAIN");
this.startActivity(intent);
}
}
通过Intent组件附带参数实现传值
// 创建Intent对象
Intent intent=new Intent(occurpy,CaculateActivity.class);
// 携带数据
intent.putExtra("data","content");
// 跳转
startActivity(intent);
Intent对象提供了很多重载的方法供我们使用
获取跳转页面附带的参数
// 获取intent信息
Intent intent=getIntent();
// 里面附带的参数
String data = intent.getStringExtra("data_name");
在Activity中,使用Intent 既可以将数据传给下一个Activity,还可以将数据回传给上一个Activity。通过查阅API文档可以发现,Activity中提供了一个startActivityForResult(Intent intent,int requestCode)方法,该方法也用于启动Activity,并且这个方法可以在当前Activity 销毁时返回一个结果给上一个 Activity。这种功能在实际开发中很常见,例如发微信朋友圈时,进入图库选择好照片后,会返回到发表状态页面并带回所选的图片信息。
startActivityForResult(Intent intent,int requestCode)方法接收两个参数,第1个参数是Intent对象,第2个参数是请求码,用于判断数据的来源,输入一个唯一值即可。
在Activity01里面跳转至Activity02
// 创建Intent信息
Intent intent=new Intent(occurpy,CaculateActivity.class);
// 使用activtiy的startActivityForResult方法跳转,第二参数是请求码,第二方数据回传时我们通过requestCode来判断是哪个页面
startActivityForResult(intent,100);
接下来在Activity中添加返回数据的示例代码:
// 创建一个Intent对象,附加返回数据
Intent intent=new Intent();
intent.putExtra("extra_data","hello activity");
// 返回数据,第一个参数是响应码,一般是"0 或者 1",参数2是把带有参数的Intent传递进去
setResult(1,intent);
// 只有在被调用的activity被销毁的时候,才会触发本来的activity的方法,所以我们需要手动调用一finish
finish();
在Activity01中重写onActivityResult方法来得到返回数据,因为在Activtiy02被销毁时会回调Activity01的onActivityResult方法
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// 通过判断请求码以判断是从哪个activity传递回来
// 因为通常我们会调用很多不同的页面,而被调用的页面最终传递数据都会回调当前方法
if(requestCode==100){
if(resultCode==1){
String result=data.getStringExtra("result");
edit02.setText(result);
}
}
}
1.我们使用Intent进行传值,传输数据给第二个页面,第二个页面计算完再返回第一个页面
2.调用系统相机拍照,显式在当前页面
源码
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="输入一些数字,用空格隔开"
android:layout_marginTop="60dp"
android:id="@+id/edit01"></EditText>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_below="@+id/edit01"
android:id="@+id/line01"
android:gravity="center_horizontal">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="点击求取平均值"
android:id="@+id/btn01"></Button>
</LinearLayout>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="计算的结果将显式在这里"
android:layout_marginTop="60dp"
android:id="@+id/edit02"
android:layout_below="@+id/line01"></EditText>
<ImageView
android:layout_width="200dp"
android:layout_height="200dp"
android:id="@+id/img01"
android:layout_below="@+id/edit02"
android:src="@color/colorPrimary"
android:layout_centerHorizontal="true"></ImageView>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_below="@+id/img01"
android:id="@+id/line02"
android:gravity="center_horizontal">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="点击拍照"
android:layout_marginTop="20dp"
android:id="@+id/btn02"></Button>
</LinearLayout>
</RelativeLayout>
MainActivity
public class MainActivity extends AppCompatActivity {
// 声明
private AppCompatActivity occurpy;
private Button btn_caculate;
private Button btn_camera;
private EditText edit01;
private EditText edit02;
private ImageView img;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 绑定
occurpy=this;
btn_caculate=this.findViewById(R.id.btn01);
btn_camera=this.findViewById(R.id.btn02);
edit01=this.findViewById(R.id.edit01);
edit02=this.findViewById(R.id.edit02);
img=this.findViewById(R.id.img01);
btn_caculate.setOnClickListener(new View.OnClickListener() {
// 请求跳转其他界面进行运算
@Override
public void onClick(View v) {
Intent intent=new Intent(occurpy,CaculateActivity.class);
Log.i("cn.liuhao.application",edit01.getText().toString());
intent.putExtra("data",edit01.getText().toString());
occurpy.startActivityForResult(intent,200);
}
});
btn_camera.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent();
intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
occurpy.startActivityForResult(intent,300);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// 在其他activity回显数据时,会使用到onActivityResult
if(requestCode==200){
if(resultCode==200){
String result=data.getStringExtra("result");
edit02.setText(result);
}
}
if(requestCode==300){
Bundle extras=data.getExtras();
Bitmap photo=extras.getParcelable("data");
img.setImageBitmap(photo);
try {
FileOutputStream out=openFileOutput("a.jpeg", Activity.MODE_PRIVATE);
photo.compress(Bitmap.CompressFormat.JPEG,75,out);
out.close();
}catch (Exception e){
e.printStackTrace();
}
}
}
}
caculateActivity
public class CaculateActivity extends AppCompatActivity {
private TextView txt01;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_caculate);
// 接受数据
Intent intent=getIntent();
String data = intent.getStringExtra("data");
Log.i("cn.liuhao.application",data);
txt01=this.findViewById(R.id.txt01);
// 分隔字符串
String[] split = data.split("\\s+");
double sum=0;
for(String item : split)
{
txt01.setText(txt01.getText()+"+"+item);
// 计算
sum+=Double.parseDouble(item);
}
Intent re=new Intent();
re.putExtra("result",String.valueOf(sum));
this.setResult(200,re);
this.finish();
}
}
文章浏览阅读99次。百练2757: 题目描述: 对于给定的序列,求出最长上升子序列的长度。题目链接:http://bailian.openjudge.cn/practice/2757解题思路一、动态规划 1. 找子问题错误找法: “求序列的前n个元素的最长上升子序列的长度”是个子问题,但这样分解子问题,不具有“无后效性” 假设F(n) = x,但可能有多个序列满足F(n)..._. s,c; xm,xadnn/ or 0
文章浏览阅读4.9k次。想拥有自己的服务器?价钱太贵,便宜的配置太低。。。总是处于各种原因,现在特大好消息,阿里云服务器活动,价钱低到爆,快来了解下,2核4G,3年低至699,时间有限,还剩10天,快来选购吧,地址:https://promotion.aliyun.com/ntms/act/vm/aliyun-group/buy.html?group=IAq264WFLl当我们在浏览器的地址栏输入 www.lin..._浏览器network发起请求历程
文章浏览阅读1.9k次。今天介绍几个好用到爆的Python内置库,相信大家看过之后会对今后的Python编程帮助多多,喜欢记得收藏、点赞、关注。argparsePython当中的argparse模块主要用于命令行的参数解析,可以帮助用户轻松地编写命令行接口,我们先来看一个例子import argparse# 解析参数parser = argparse.ArgumentParser()parser.add_argument("name")args = parser.parse_args()# 打印结果print_python内置模块
文章浏览阅读1.3k次。机器视觉python代码基础知识总结(一)一、理论简述个人认为机器视觉可以作为人工智能的一大分支,尤其是随着深度学习、卷积神经网络、残差网络的出现,导致机器对图像识别精度高于了人类。因此,可以说机器视觉是人工智能的目前相对十分成熟的应用。下面的表格从IPO层面介绍了各种领域之间的关系,这里分别包含的有数据图像处理(Digital Image Processing)、计算机视觉(Computer Vision)、计算机图形学(Computer Graphics)、人工智能(Artificial Inte_python f ' {app_type}-{region}
文章浏览阅读2.2k次。当我们调用 new 的时候,例如 int *p = new int; 时,编译器到底作了什么工作呢?跟进断点看一看。 (在vc debug模式下)double *p1 = new double;00411A6E push 8 00411A70 call _编译器new实现
文章浏览阅读171次。java编程解决最强大脑玲珑拼图_最强大脑游戏代码
文章浏览阅读2k次。太多了吧:No. a b c d1 4 86 17 652 13 96 20 873 5 97 56 544 4 32 14 ..._matlab 不等式组求解
文章浏览阅读273次,点赞4次,收藏4次。所以,答案D是错误的。两个角色小猫和小狗,给小猫创建一个仅适用于当前角色的变量“奔跑速度”,给小狗也创建一个仅适用于当前角色的变量“奔跑速度”,小猫和小狗程序如下图所示,点击绿旗,按下两次空格键,小猫和小狗的奔跑速度都变为7。运行程序后角色将从(0,0)点开始移动,x和y坐标的增加值均在1至10之间,因此,移动后的位置为点(1,1),(1,10),(10,1)和(10,10)所围成的四边形中。D:“我的变量”和计时器一起增加,当“我的变量”大于15时,计时器会归零,“我的变量”会随着计时器重新开始增加。_2022年9月scratch三级真题
文章浏览阅读2.7k次,点赞5次,收藏6次。Spring Security 是一个非常强大的安全框架,可以为 Spring Boot 应用提供完整的身份认证和授权功能。本文介绍了 Spring Security 如何实现身份认证和授权,并提供了示例代码。使用 Spring Security 可以非常方便地保护应用程序,防止恶意攻击和数据泄露。_spring security认证和授权流程
文章浏览阅读3.4k次,点赞2次,收藏16次。ImageMagick 是一个免费的创建、编辑、合成图片的软件。它可以读取、转换、写入多种格式的图片。图片切割、颜色替换、各种效果的应用,图片的旋转、组合,文本,直线,多边形,椭圆,曲线,附加到图片伸展旋转。ImageMagick是免费软件:全部源码开放,可以自由使用,复制,修改,发布。它遵守GPL许可协议。它可以运行于大多数的操作系统。ImageMagick的大多数功能的使用都来源于命令行..._linux imagemagick 安装目录
文章浏览阅读908次。<permission-group>语法:<permission-group android:description="string resource" android:icon="drawable resource" android:label="string resource" ..._android permission-group
文章浏览阅读688次。今天阿里云的一台centos8服务器的出现了显示磁盘占满,但实际磁盘未占满的问题,截了一些相关的图片阿里云监控截图个人解决方法:查了一些网上的说法,使用重启服务器的方法,解决了这个问题,但不太明白产生这个问题的原因。..._centos本机磁盘满了 实际占用比没那么多