文档章节

安卓精要:Activity

无极客
 无极客
发布于 07/16 01:07
字数 2774
阅读 33
收藏 0

读《安卓第一行代码》第二章

2.2活动的基本用法

2.2.1创建活动

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //setContentView(R.layout.activity_main);加载布局,需要下节定义和创建布局
    }
}

项目中的任何活动都应该重写Activity的onCreate()方法

2.2.2创建和加载布局

在 app/src/main/res/layout目录下创建布局文件,如first_layout.xml

<LinearLayout xmlns:android="http://schemas.androld.com/apk/res/android"
android:Orientation="vertical"
android:layoutwidth="matchparent"
android:layout_height="match_parent">
	<Button
	android:id="@+id/button_1"
	android:layout_width="match_parent"
	android:layoutheight="wrapcontent"
	android:text="Button 1"/>
</LinearLayout>

android:id是给当前元素定义一个唯一的标识符,之后可以在代码中对这个元素进行操作 @id/button_1用于在XML中引用一个id @+id/button_1用于在XML中定义一个id android:layout_width指定元素宽度 android:layoutheight指定元素高度 wrap_content表示刚好包含内容 match_parent表示匹配父容器大小

通过在Activity中调用findViewById就可以取得button对象

2.2.3在AndroidManifest文件中注册

在application标签中加入

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.activitytest">
    <application 省略属性>
        <activity android:name=".FirstActivity"
        android:label="Hello World"
        >
         <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

因为mainfest标签声明了package com.example.activitytest 所以.FirstActivity表示 com.example.activitytest.FirstActivity

         <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

表示First是程序的主活动,可以被系统桌面点击图标的方式启动

android:label="Hello World"表示标题栏(如果有)中的文字

2.2.4在活动中使用Toast

显示提示文字

Toast.makeText(FirstActivity.this,"Hello",Toast.LENGTH_SHORT).show(); 参数一Context 参数二显示字符串 参数三 Toast.LENGTH_SHORT 或 Toast.LENGTH_LONG 设置显示时长

2.2.5 在活动中使用菜单

2.2.6销毁活动

一般在主活动界面按BACK键就可以销毁活动

也可以调用活动的finish()方法销毁活动,效果与按BACK键一样

2.3使用Intent在活动间穿梭

Intent表示一个 "意图",可以看做一个封装了调用信息的消息对象,是安卓中各种组件间进行交互的一种方式 它指明组件想要执行的动作还可以在不同组件之间传递数据

它可以启动活动,服务,发送广播

Intetn分为两种,显式Intent和隐式Intent

2.3.1使用显式Intent

使用Intent的一个构造函数Intent(Context packageContext,Class<?> class) context要求提供一个启动活动的上下文 class则是指定想要启动的目标活动

Intent intent=new Intent(FirstActivity.this,SecondActivity.class)
startActivity(intent)

使用Activity类中的startActivity(Intent intent)方法就可以启动一个活动 显式Intent,明确指定了要启动哪一个Activity

2.3.2使用隐式Intent

隐式Intent,而不指定要启动哪一个Activity,指定了一系列信息 然后交由系统去分析这个Intent,并找到合适的活动去启动 通过在<activity>标签下配置<intent-filter>内容可以指定该活动能够响应 的action和category

action标签中指明了当前活动可以响com.example.activitytest.ACTION_START这个action,每个Activity中智能有一个 而category标签则包含了一些附加信息,更精确地指明了当前的活动能够响应的Intent中还可能带有的category,每个Activity中可以有多个 只有action和category中的内容同时能匹配上Intent中指定的action 和category时,这个活动才能响应该Intent

Intent intent=new Intent("com.example.activitytest.ACTION_START")
startActivity(intent)

这里使用了Intent的另一个构造函数,直接将action的字符串传入

android.intent.category.DEFAULT是一种默认category,调用startActivity()时,方法会自动将此category添加到Intent中

添加category的方法是调用intent.addCategory("android.intent.category.DEFAULT");

2.3.3更多Intent的用法

使用隐式Intent我们不仅可以启动自己程序内的活动,还可以启动其它程序的活动,比如“用浏览器打开”

Intent intent =new Intent(Intent.ACTION_VIEW);
Intent.setDate(Uri.Parse("http://www.baidu.com"));
startActivity(intent);

Intent.ACTION_VIEW是系统内置的一个动作android.intent.action.VIEW 通过parse方法解析字符串取得一个uri对象 调用setData()设置intent的属性 setData接受一个Uri对象作为数据

与它对应,intent-filter标签中可以配置一个data标签用于更精确地指定当前活动能够响应什么类型的数据 data标签中主要可以配置以下内容: android:scheme 指定协议部分 android:host 指定主机名 android:port 指定端口 android:path 端口后面的内容,包括路径 android:mimeType 指定数据类型,可以是通配符 只有data标签中的内容匹配intent的data时,活动才会响应

2.3.4 向下一个活动传递数据

button1.setOnClickListener(new View.OnClickListener(){
    @Override
    public void onClick(View v){
        String data=“He110SecondActivity
        Intent intent=new Intent(FirstActivity.this,SecondActivity.Class);
        intent.putExtra("extra_data",data);//对intent附加数据
        StartActivity(intent)
    }
}
public class SecondActivity extends AppCompatActivity{
@Override
protected void onCreate(BundtesavedInstanceState){
    super.onCreate(savedInstanceState),
    setContentView(R.layout,second_layout);
    Intent intent=getlntent();
    String data=intent.getStringExtra("extradata");
    //取的intent中的数据,这里用getStringExtra,类似的还有getIntExtra等
    Log.d("SecondActivity",data);
    }
}

2.3.5 返回数据给调用此Activity的Activity

buttonl.set0nClickListener(new View.OnClickListener(){
@Override
    publicvoidonClick(Viewv){
        Inten tintent=newIntent(FirstActivity,this,SecondActiVity.Class);
        StartACtivityForResu1t(intent,1);
        //1是一个标识改调用的id,后面处理返回的方法用它来识别是哪个调用
    }
}

public class SecondActivity extends AppCompatActivity{
@Override
    protected void onCreate(BundIe savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.secondlayout);
        Button button2=(Button)findViewById(R.id.button_2);
        button2.setOnClickListener(newView.OnClickListener(){
        @Override
        public  void Click(View v){
            Intent intent=new Intent();
            intent.putExtra("datareturn","Hello FirstActivity");
            //此intent不包含什么意图,仅作传递数据用
            setResult(RESULT_OK,intent);
            finish();
        }
}

FirstActivity的onActivityResult将被调用

@Override
protected void onActivityResult(int requestCode,int resultCode,Intent data){
    switch(requestCode){
    case 1:
        if(resultCode==RESULT_OK){
            String returnedData=data.getStringExtra("datareturn");
            Log.d("FirstActivity",returnedData);
            break;
       }
    }
}}

requestCode 唯一数字,用于标识是哪个被调用者 resultCode 被调用这传回的返回码,如RESULT_OK data 被调用者传回的intent

上面的实现必须在用户按下被调用活动的按钮时才会返回

我们还可以覆盖onBackPressed()方法,在用户按Back退出被调用Activity时返回数据

        @Override
        public  void onBackPressed(){
            Intent intent=new Intent();
            intent.putExtra("datareturn","Hello FirstActivity");
            setResult(RESULT_OK,intent);
            finish();
        }

2.4活动的生命周期

2.4.1 返回栈

Android使用任务(Task)来管理活动的,一组存放在栈里的活动的集 合,这个栈也被称作返回栈 每个应用上下文会有一个返回栈(而不是整个系统一个栈); 我们启动了一个新的活动,它会入栈,并处于栈顶; 当我们按下Back键或调用行finish()方法去销毁一个活动时; 处于栈顶的活动会出栈; 系统总是会显示处于栈顶的活动给用户; 如果栈底活动出栈,将退出应用,返回桌面

2.4.2 活动状态

1.运行 即栈顶活动
2.暂停 即非栈顶的可见活动,比如栈顶的活动不满屏或者透明,它叠在另一个可见活动上面
3.停止 非栈顶活动,且不可见
4.销毁 不再栈中的活动

系统内存不足时,按上面4321状态优先级,销毁活动

2.4.3 活动的生存期

onCreate()它会在活动第一次被创建的时候调用。你应该在这个方法中完成活动的初始化操作,比如 说加载布局、绑定事件等。

onStart()这个方法在活动由不可见变为可见的时候调用。 这个方法在活动准备好和用户进行交互的时候调用。此时的活动一定位于 返回栈的栈顶,并且处于运行状态。

onResume() 这个方法在系统准备去启动或者恢复另一个活动的时候调用。

onPause()我们通常会在 这个方法中将一些消耗CPU的资源释放掉,以及保存一些关键数据,但这个方法的执行 速度一定要快,不然会影响到新的栈顶活动的使用。

onstop()这个方法在活动完全不可见的时候调用,它和onpause()方法的主要区别在 于,如果启动的新活动是一个对话框式的活动,那么onpause()方法会得到执行,而 onStop()方法并不会执行

onDestroy()这个方法在活动被销毁之前调用,之后活动的状态将变为销毁状态。

onRestart()这个方法在活动由停止状态变为运行状态之前调用,也就是活动被重新 启动了

以上7个方法中除了onRestart()方法,其他都是两两相对的,从而又可以将活动分为3 种生存期。

完整生存期 活动在onCreate()方法和onDestroy()方法之间所经历的,就是完整生存 期。一般情况下,一个活动会在oncreate()方法中完成各种初始化操作,而在 onDestroy()方法中完成释放内存的操作

可见生存期。活动在onstart()方法和onstop()方法之间所经历的,就是可见生存期 在可见生存期内,活动对于用户总是可见的,即便有可能无法和用户进行交互。我们可 以通过这两个方法,合理地管理那些对用户可见的资源。比如在onstart()方法中对资 源进行加载,而在onstop()方法中对资源进行释放,从而保证处于停止状态的活动不会 占用过多内存。

前台生存期。活动在onResume()方法和onPause()方法之间所经历的就是前台生存期 在前台生存期内,活动总是处于运行状态的,此时的活动是可以和用户进行交互的,我 们平时看到和接触最多的也就是这个状态下的活动。

2.4.5 活动被回收了怎么办

Activity中提供了一个onSaveInstanceState()它 法在活动被回收之前一定会被调用。 onSaveInstanceState()方法会携带一个Bundle类型的参数,Bundle提供了一系列的方 法用于保存数据,比如可以使用putStnng()方法保存字符串,使用putlnt()方法保存整型数 据,以此类推。每个保存方法需要传人两个参数,第一个参数是键,用于后面从Bundle中取值

通过onCreate()的Bundle参数就可以取出保存的数据了

此外Bundle可以结合Intent使用 Bundle储存数据后可以放在Intent中 目标对象可以在Intent中通过Bundle取出数据

2.5活动的启动模式

在activity标签中添加属性 android:launchMode="启动模式"

2.5.1 standard (默认)

系统不管栈中是否存在该活动,启动活动时总是创建新的活动实例置于栈顶

2.5.2 singleTop

如果栈顶的活动就是要启动的活动,那么直接使用它,不创建新的活动实例 不在栈顶的活动依然和默认一样处理

2.5.3 singleTask

只要在栈中存在,就直接用它

2.5.4 singleInstance

启用独立的栈来管理活动,多个调用该活动的应用可以共享该栈

© 著作权归作者所有

共有 人打赏支持
无极客
粉丝 0
博文 7
码字总数 25385
作品 0
潮州
私信 提问
《Android开发精要》将于2012年3月隆重上市

融合本人多年功力精心写就的《Android开发精要》将于2012年3月隆重上市,作为机械工业出版社2012年的重点图书,全面、重点介绍了Android开发的技术难点和重点。 不同于以实例为主的普通Andro...

苗忠良
2012/01/13
0
9
Android使用Intent调用摄像头并获取照片

使用Android的Intent调用另外一个activity的时候,采用的是多线程机制,异步方式。startActivityForResult之后被调用activity并没有马上返回结果给调用activity,Android的Acitivity对象中s...

huist
2015/11/13
0
0
寒冬已至?四面楚歌的Android工程师该何去何从

本文首发于 刘望舒的博客 地址:liuwangshu.cn/life/androi… 寒冬真的来了吗?可能是吧,因为最近几年每年都说是寒冬,说的真的叫人焦虑。不过互联网的整体环境确实不如前几年,即使不说我想...

刘望舒
11/04
0
0
Android开发优化之——对界面UI的优化(1)

在Android应用开发过程中,屏幕上控件的布局代码和程序的逻辑代码通常是分开的。界面的布局代码是放在一个独立的xml文件中的,这个文件里面是树型组织的,控制着页面的布局。通常,在这个页面...

KingMing
2015/04/03
0
0
寒冬已至?四面楚歌的 Android 工程师该何去何从?

作者 | 刘望舒 责编 | 胡巍巍 寒冬真的来了吗?可能是吧,因为最近几年每年都说是寒冬,说的真的叫人焦虑。不过互联网的整体环境确实不如前几年,即使不说我想大家也能隐约的感受到了。作为曾...

CSDN资讯
11/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

php获取客户端IP

php获取客户端IP 首先先阅读关于IP真实性安全的文章:如何正確的取得使用者 IP? 「任何從客戶端取得的資料都是不可信任的!」 HTTP_CLIENT_IP头是有的,但未成标准,不一定服务器都实现。 ...

DrChenXX
12分钟前
0
0
. The valid characters are defined in RFC 7230 and RFC 问题

通过这里的回答,我们可以知道: Tomcat在 7.0.73, 8.0.39, 8.5.7 版本后,添加了对于http头的验证。 具体来说,就是添加了些规则去限制HTTP头的规范性 参考这里 具体来说: org.apache.tom...

west_coast
30分钟前
1
0
刷leetcode第704题-二分查找

今天双十一买的算法书到货了,路上刷到有人说的这个题,借(chao)鉴(xi)一下别人的思路,这个是C++标准库里面的经典方法,思路精巧,优雅好品味 int search(int* nums, int numsSize, in...

锟斤拷烫烫烫
56分钟前
1
0
【分享实录】BANCOR算法详解及代码实现

1 活动基本信息 1)主题:【区块链技术工坊22期】BANCOR算法详解及代码实现 2)议题: BANCOR算法的特点和优劣势 BANCOR算法和举例 如何加入BANCOR.NETWORK交易所 如何开发自己的BANCOR去中心...

HiBlock
今天
2
0
微信小程序(2)

开始看微信小程序的教程了。刚刚看完官方教程的视图层部分。这里摘录一些自己认为的部分关键点。 1.直接修改数值无法重新渲染,需要使用setData()方法; 2.列表渲染中:wx:key用于保持项目在...

MKjy
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部