Android笔记:Activity

1.Android可视化界面结构:
    一个Android应用的可视化界面最底层是Activity,在他之上是一个Window对象,在window之上通常是布局容器,再上面才是用户直接交互的组件(按钮,文本框)
交互组件(UI控件)-->布局容器(layout)--->Window对象--->Activity
2.Activity生命周期
    Activity是以栈的形式管理的,当前活动的Activity位于栈顶,其他的Activity则处于非活动状态.
       Activiy生命周期中的4个重要状态
            活动 处于栈顶位置,用户进行交互
            暂停 可见但失去焦点,用户不能进行交互
            停止 不可见
            销毁 被系统和进程Kill掉
         细分Activity生命周期为3个关键的嵌套子周期:
            首尾:第一次调用onCreate()到最后调用onDestroy().对应的做全局的初始化,以及最后的释放.
            可见但不一定交互:从调用onStart()到对应调用一次onStop(),用户可以在屏幕上看到Activity但不一定能与之交互,可以在这期间维护向用户显示的资源.
                                    onReSart()被停止的Activity重新被启动.
           活动周期:从调用onResume()到对应的onPause(),活动的activtiy与用户进行交互
3.控制Activity的生命周期
    用户很多常见的操作都会引起Activity的暂停,停止,结束甚至启动多个程序版本,对于程序而言,这些都应该是要尽量避免的.
    3.1强制执行单任务模式:
        比如当程序执行跳转操作之后再次的启动,可能会在手机上产生多个Activity实例(系统自动Kill多余的实例或者引发异常).
        那么我们为了保证任何时候,每个Activity都只有一个正在运行的实例,只需要在AndroidManifest.xml的Activity元素中加入以下代码:
        android:lauchMode="singleInstance"
        如果想要限制一个程序中只有一个activity实例,只需要在AndroidManifest.xml的Activity元素中加入以下代码:
        android:lauchMode="singleTask"
   3.2强制手机屏幕方向
        手机屏幕方向改变时,Activity被结束然后再重新启动,这样导致程序丢失了当前的状态.
        那么有一种方案是禁止切换应用程序的视图(屏幕方向的切换),在AndroidManifest.xml的Activity元素中加入以下代码:
        android:screenOrientation="portrait"(纵向)或者android:screenOrientation="landscape"(横向)
        问题还没有完全解决,以上代码只是将程序始终保存在指定的方向,并不能防止Activity的重新启动的一系列操作.
        要实现不重启,还需要在AndroidManifest.xml中设置

        android:configChanges="orientation|keyboradHidden"(手机屏幕方向,键盘滑出时触发),事件为onConfigurationChanged(Configuration newConfig)
   3.3保存和恢复Activity的信息
       手机屏幕方向改变时,Activity被结束然后再重新启动,这样导致程序丢失了当前的状态.
       我们可以保存当前Activity的信息,然后再重启是恢复之前的信息
       实现这一想法就是:onSaveInstanceStateonRestoreInstanceState
       原理:当一个Activty即将被Kill时,通过重写onSaveInstanceState来保存需要保存的状态的相关信息,当重新创建该Activity后,之前onSaveInstanceState保存的状态信息将
通过Bundle传递给onCreate方法,然后就可以利用onRestoreInstanceState方法来保存恢复之前的状态信息了.
值得注意一下:
触发onSaveInstanceState的几个操作:(实际Activity销毁)
1.当用户按下HOME键
2.长按HOME
3.按下电源按键,屏保状态
4.屏幕方向切换(不设置configChanges)
Note:除了第4种,其他的3种情况,onSaveInstanceState和onRestoreInstanceState不一定是被成对调用的.

4.Activity的交互
    4.1启动另一个Activity(跳转)
        1.定义一个Intent,并为该Intent指定即将被启动的Activity
         Intent newActivityIntent=new Intent(this,NewActivity.class);
        2.调用Intent的startActivity方法启动并跳转到新的Activity
         startActivity(neActivityIntent);
        3.当新的Activity执行完毕之后,调用finish方法结束当前Activity,并将控制权交回给调用它的Activity.
         finish();
        4.在ActivityManifest.xml中声明新的Activity(注册)
    4.2启动另一个Activity并返回结果
        1.定义一个Intent,并为该Intent指定即将被启动的Activity
        2.调用startActivityForResult(Intent intent,int requestCode)跳转并标记requestCode
        3.重写onActivityResult(int requestCode,int resultCode,intent data)解析返回的数据
        4.在另一个Activity中调用setResult(RESULT_OK,backintent)
Note:在Activity之间传递数据Bundle:一个类型安全的容器,只能存储基本数据类型或基本类型的数组,如string,int,byte和boolean等

 

 

代码:

string资源文件:

<?xml version="1.0" encoding="utf-8"?>
<resources><string name="app_name">SetupNewActivity</string><string name="hello_world">Hello world!</string><string name="StartActivitiy">这是启动页面的Activity</string><string name="NewActivity">启动新的Activity</string><string name="EndNewActivity">结束当前Activity</string><string name="ShowNewActivity">这是新启动的Activity界面</string>
</resources>

主页面:activity_lauch.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context="${relativePackage}.${activityClass}" ><TextView android:layout_width="match_parent"android:layout_height="wrap_content"android:text="@string/StartActivitiy"/><Button android:text="@string/NewActivity"android:id="@+id/SetupNew"android:layout_width="wrap_content"android:layout_height="wrap_content"android:gravity="center_horizontal"android:layout_marginTop="20dp"/>
</RelativeLayout>

跳转页面:activity_new.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context="${relativePackage}.${activityClass}" ><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:text="@string/ShowNewActivity"></TextView><Buttonandroid:text="@string/EndNewActivity"android:id="@+id/End"android:layout_width="wrap_content"android:layout_height="wrap_content"android:gravity="center_horizontal"android:layout_marginTop="20dp"></Button>
</RelativeLayout>

LauchActivity.java:

package com.YZR.setupnewactivity;import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;public class LauchActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_lauch);Button setupButton=(Button)findViewById(R.id.SetupNew);setupButton.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View arg0) {// TODO Auto-generated method stub
                setupNewActivity();}});}private void setupNewActivity() {// TODO Auto-generated method stubIntent newActivityIntent=new Intent(LauchActivity.this,NewActivity.class);startActivity(newActivityIntent);}
}

NewActivity.java

package com.YZR.setupnewactivity;import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;public class NewActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_new);Button endButton=(Button)findViewById(R.id.End);endButton.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stub
                finish();}});}
}

AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.YZR.setupnewactivity"android:versionCode="1"android:versionName="1.0" ><uses-sdkandroid:minSdkVersion="8"android:targetSdkVersion="21" /><applicationandroid:allowBackup="true"android:icon="@drawable/ic_launcher"android:label="@string/app_name"android:theme="@style/AppTheme" ><activityandroid:name="LauchActivity"android:label="@string/app_name" ><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><activityandroid:name="NewActivity"android:label="@string/app_name"><intent-filter><action android:name="android.intent.action.VIEW" /><category android:name="android.intent.category.DEFAULT" /></intent-filter></activity></application></manifest>

    

下一节再介绍传值跳转.

 

仅供学习之用.

END

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="app_name">SetupNewActivity</string>
    
    <string name="hello_world">Hello world!</string>
    <string name="StartActivitiy">这是启动页面的Activity</string>
    <string name="NewActivity">启动新的Activity</string>
    <string name="EndNewActivity">结束当前Activity</string>
    <string name="ShowNewActivity">这是新启动的Activity界面</string>
</resources>

转载于:https://www.cnblogs.com/Francis-YZR/p/4892595.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/290141.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ASP.NET Core使用编译时依赖关系注入(DI)

前言依赖关系注入(DI)&#xff0c;是一种在类及其依赖项之间实现控制反转(IoC)的技术。在ASP.NET Core中&#xff0c;依赖关系注入是“一等公民”&#xff0c;被大量使用。通常&#xff0c;使用接口作为依赖关系实现抽象化&#xff0c;并且在服务容器中注册依赖关系&#xff0c…

使其正序排序 打印一串数字_JavaScript计数排序算法

一、计数排序算法计数排序(Counting sort)是一种稳定的线性时间排序算法。该算法于1954年由 Harold H. Seward 提出。计数排序使用一个额外的数组&#xff0c;数组的下标对应待排序的数字。然后根据新数组的下标来获得正确的顺序。就像给每个位置按数字顺序做好标记&#xff0c…

shiro real的理解,密码匹配等

1 、定义实体及关系 即用户-角色之间是多对多关系&#xff0c;角色-权限之间是多对多关系&#xff1b;且用户和权限之间通过角色建立关系&#xff1b;在系统中验证时通过权限验证&#xff0c;角色只是权限集合&#xff0c;即所谓的显示角色&#xff1b;其实权限应该对应到资源&…

ASP.NET-----Repeater数据控件的用法总结(转)

ASP.NET-----Repeater数据控件的用法总结(转) 一、Repeater控件的用法流程及实例&#xff1a; 1、首先建立一个网站&#xff0c;新建一个网页index.aspx。 2、添加或者建立APP_Data数据文件&#xff0c;然后将用到的数据库文件放到APP_Data文件夹中。 3、打开数据库企业管理器&…

Jenkins修改管理员密码.

前言&#xff1a;Jenkins修改管理员密码&#xff0c;我看了网上所有的教程&#xff0c;竟然全都是拿着一串已经加密好的111111的密文去替代config.xml文件里面的密码&#xff0c;然后大家的密码都是111111&#xff01;我觉得这种做法实在太敷衍了&#xff01;于是我就研究了下&…

截取指定字符前_VBA学习笔记35-1:字符串拆分与组合

学习资源&#xff1a;《Excel VBA从入门到进阶》第35集 by兰色幻想本课的示例都在立即窗口展示运行结果&#xff0c;要在立即窗口展示的话要使用“Debug.Print”。Debug.Print 将代码执行结果显示在“立即窗口”中&#xff0c;但不影响程序执行。一、字符串截取1.left,right,mi…

c#Clay开源的动态语言dynamic框架,让您形如javascript的方式创建对象!

简介Clay非常类似于ExpandoObject, 可以看做是ExpandoObject的加强版. 它们能够让我们在不需要定义类的情况下&#xff0c;就构建出我们想要的对象。Clay和ExpandoObject相比&#xff0c;提供了更加灵活的语法支持&#xff0c;让我们像写javascript代码一样写C#代码&#xff0c…

7 种 JavaScript 技巧使你更聪明

1.总是颠倒逻辑 让我们从一个小优化开始&#xff0c;目的是为了使得非常简单的操作看起来复杂些。 if (x && y) { … } // bad if (!(!x || !y)) { … } // good2.在你的变量名字里使用扩展的unicode字符 编译好的软件一旦发布成产品&#xff0c;它必须是一个黑盒。这对…

设置访问权限_【新思考教学者思】李世松:不要对经典设置访问权限

不要对经典设置访问权限——《背影》备课札记文/李世松紫阳县举办课堂教学改革推进会&#xff0c;师训教研中心王主任电话通知我讲一节示范课。我知道&#xff0c;这既是对我的一种肯定&#xff0c;更是一次磨炼&#xff0c;因为我的师父邱俊老师会到现场点评课堂。自领受任务之…

C#使用Objects Comparer进行对象比较

介绍Objects Comparer是用于对象比较的工具&#xff0c;c#常见的数据结构都是可以用这个三方库进行对比&#xff0c;比较复杂的对象也是可以比较的。简而言之&#xff0c;Objects Comparer 是一个对象到对象的比较器&#xff0c;它允许逐个成员递归得比较对象&#xff0c;并为某…

ora22813操作数值超出系统的限制_最新:华为“鸿蒙”操作系统终于面世!一旦遭到限制,将随时启用...

受美国的要求&#xff0c;自5月开始&#xff0c;安卓暂停了与华为的部分合作&#xff0c;而这直接影响到了华为对安卓系统的正常更新。迫于无奈之下&#xff0c;华为对外表示&#xff0c;已经准备了备用系统&#xff0c;但只在必要的情况下使用&#xff0c;而这一系统就是广为人…

Blazor University (2)布局 — 创建 Blazor 布局

原文链接&#xff1a;https://blazor-university.com/layouts/布局Blazor 布局类似于 ASP Webforms 母版页的概念&#xff0c;与 ASP MVC 中的 Razor 布局相同。几乎网络上的每个网站都有一个模板用于整个网站&#xff08;页面顶部的品牌&#xff0c;底部的版权&#xff09;或网…

iOS开发UI篇—使用嵌套模型完成的一个简单汽车图标展示程序

iOS开发UI篇—使用嵌套模型完成的一个简单汽车图标展示程序 一、plist文件和项目结构图 说明&#xff1a;这是一个嵌套模型的示例 二、代码示例&#xff1a; YYcarsgroup.h文件代码&#xff1a; 1 //2 // YYcarsgroup.h3 // 07-汽车展示&#xff08;高级&#xff09;4 //5 //…

awb数据怎么计算_白平衡自己主动(AWB)算法---2,颜色计算

本文说明了白平衡算法估计当前场景的色温过程.色温计算的原理并不复杂,但要做到,还是一道&#xff0c;认真做好每一步,这需要大量的测试,和算法一直完好.关于该过程首先简要:1, 取的图像数据,并划分MxN块,如果是25x25,并统计每一块的基本信息(,白色像素的数量及R/G/B通道的分量…

svn强制要求提交注释

2019独角兽企业重金招聘Python工程师标准>>> 看了N多资料&#xff0c;不知道为什么我总是不成功。现在终于测试成功了&#xff0c;下面是实际操作过程~~ 使用bitnami一键安装了subversion&#xff0c;在使用中&#xff0c;希望开发人员提交时必须输入日志内容&#…

Xamarin效果第五篇之ScrollView动态滚动效果

前面基于Xamarin做了一点效果;这不过年从老家回来一直成沉迷工作无法自拔,没时间来更新文章了;今天赶紧抽点时间再来更新一下效果;直接看看最终实现的效果:前台RadioButton的事件绑定选中状态绑定:后台对ScrollView的滚动处理:ScrollView的滚动对当前选中状态的修改&#xff1a…

9 个使用前必须再三小心的 Linux 命令

Linux shell/terminal 命令非常强大即使一个简单的命令就可能导致文件夹、文件或者路径文件夹等被删除。 在一些情况下Linux 甚至不会询问你而直接执行命令导致你丢失各种数据信息。 一般来说在 Web 上推荐新的 Linux 用户执行这些命令当然也有人哪些写过这代码的人不这么想因为…

池化层在全连接层之间吗,了解最大池化层之后的全连接层的尺寸

In the diagram (architecture) below, how was the (fully-connected) dense layer of 4096 units derived from last max-pool layer (on the right) of dimensions 256x13x13? Instead of 4096, shouldnt it be 256*13*1343264 ?解决方案If Im correct, youre asking why …

Blazor University (3)组件 — 创建组件

原文链接&#xff1a;https://blazor-university.com/components组件所有呈现的 Blazor 视图都来自 ComponentBase 类&#xff0c;这包括布局、页面和组件。Blazor 页面本质上是一个带有 page 指令的组件&#xff0c;该指令指定浏览器必须导航到的 URL 才能呈现它。事实上&…

Codeigniter中创建LeanCloud云函数实现微信支付

2019独角兽企业重金招聘Python工程师标准>>> 经过摸索&#xff0c;与官方提供的slim无异&#xff0c;同样使用__invoke魔法函数即可&#xff0c;步骤如下&#xff1a; 1.config.php打开hook&#xff0c;即设置$config[enable_hooks] TRUE; 详情文档参见&#xff1a…