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的信息,然后再重启是恢复之前的信息
       实现这一想法就是:onSaveInstanceState和onRestoreInstanceState
       原理:当一个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

Android笔记:Activity相关推荐

  1. Android笔记 activity生命周期 Tasks and back stack回退栈

    正常打开一个应用,先后调用Activity的onCreate.onStart.onResume 正常退出一个应用,先后调用Activity的onPause.onStop.onDestroy(进程被杀死 ...

  2. Android笔记-Activity相关+内存泄漏

    看了下,上次学习android还是17年的事情,,,,两年过去了我现在终于来搞android了... 以下内容参考自:<Android从学习到产品>,<深入理解java虚拟机> ...

  3. Android初级开发笔记-- activity启动模式的学习(1)

    第一次学习Android中一个很重要的概念,启动模式.文章记录的也只是一些入门知识,随着学习的深入还会有activity启动模式的学习(2)和(3). 下面分三个小点说一下对启动模式的理解区别以及如何 ...

  4. android 开发零起步学习笔记(二十二):ANDROID应用ACTIVITY、DIALOG、POPWINDOW、TOAST窗口添加机制及源码分析(一)

    原文:http://www.cnblogs.com/shanzei/p/4654817.html 第一部分: ANDROID应用ACTIVITY.DIALOG.POPWINDOW.TOAST窗口添加机 ...

  5. Android笔记 fragment的生命周期

    demo执行顺序 10-22 20:38:10.281: I/System.out(26337): onAttach     附加到Activity  10-22 20:38:10.281: I/Sy ...

  6. android listview替代,Android笔记——RecyclerView替代ListView

    ListView是常用列表控件,但设置Adapter时自定义代码较为复杂,因此Android3.0后,增加RecyclerView替代ListView RecyclerView没有提供OnItemCl ...

  7. Android笔记:触摸事件的分析与总结----多点触控

       其他相关博文:    Android笔记:触摸事件的分析与总结----MotionEvent对象    Android笔记:触摸事件的分析与总结----TouchEvent处理机制     An ...

  8. Android笔记【3】---多媒体播放/广播与服务

    Android笔记[3]-多媒体播放/广播与服务 1.音乐播放 (1)创建MediaPlayer媒体播放器 存储在应用程序的res资源中的音乐文件,使用create()方法创建MediaPlayer对 ...

  9. (转)Android笔记--handler机制

    一.重要参考资料 [参考资料] 目前来看,下面的几个网址中的内容质量比较不错,基本不需要再读别的网址了. 1.android消息机制一 http://xtfncel.javaeye.com/blog/ ...

最新文章

  1. sap可以指定应用服务器,SAP扫盲系列之一:什么是SAP系统和应用服务器
  2. IO流(六)之CharArrayReader类与CharArrayWriter类
  3. 来阿里前 vs 来阿里后
  4. [云炬ThinkPython阅读笔记]2.7 注释
  5. OpenCV提炼角点位置的实例(附完整代码)
  6. 将MongoDB集成到您的Spring项目中
  7. python爬虫有学c的必要吗_可以一边学python爬虫一边学c语言吗?
  8. 荣耀正式出售!30余家代理商接盘自救,华为回应...
  9. php如何控制用户数,PHP统计当前在线用户数实例讲解
  10. GPIO驱动实例:操作LED开关
  11. Kali下的钓鱼工具setoolkit和社工字典工具Cupp
  12. python爬虫小说实例源码_Python下载网络小说实例代码
  13. Windows批处理:命令echo 和 @
  14. MBP TouchBar自定义使用
  15. netty之微信-IM简介(二)
  16. 计算机用户删除文件找回,文件删除了怎么找回来_文件删掉了怎么恢复-win7之家...
  17. SpringBoot集成OAuth2.0有新方案了
  18. IPEmotion数据处理-分类元件的灵活运用——车辆制动次数的多样计算
  19. Sql Server 2008 R2 清理内存的三种方法
  20. c语言51单片机计算器,新基于51单片机的简易计算器

热门文章

  1. 网络知识:内网、外网、宽带、带宽、流量、网速之间的联系?
  2. 操作系统:Win10的沙盒是什么,如何使用,看完你就懂了!
  3. 后端:请谨慎使用Arrays.asList、ArrayList的subList
  4. 原来Github上也有这么多的JavaScript学习资源!
  5. 设计模式:里氏替换原则
  6. FTP协议及工作原理
  7. java delphi aes加密算法_Delphi AES,又一个加密算法例子
  8. dede php分页代码,DEDECMS系统分页标签自定义二次开发
  9. Linux系统文件编程(1)
  10. 割线法求解过程_求解稀疏优化问题2——临近点方法+半光滑牛顿法