菜鸟的android之路——活动相关

前言

  其实一开始并没有想着要学android开发,毕竟做游戏是我以前最大的梦想,当然现在也是,但是由于种种机缘巧合吧使我又开始走向了android开发的道路,毕竟和我的梦想相隔不是很远,努力前进!
  因为在之前已经学习过一段时间的安卓开发,但是应付差事之后就没怎么继续学习过,再加上期末考试和众多不可控因素,中间断了大概一两个月的样子,现在一直是记得一些UI控件的写法,其他都忘得差不多了,但终究还是有一点印象,所以这次的安卓学习就主要以《第一行代码——android》这一本书来学习。
注:本微博只会记录博主在学习过程中遇到的相对比较难的地方,在我看来没有理解障碍的知识点就不再进行整理了。

活动的创建

  首先,活动是什么,活动其实也是组件的一种。它是一种包含用户界面的组件,用于和用户进行交互。这基本上就是活动的定义了。那么怎么去创建一个活动这个问题就没有必要在此细说,直接列举出创建活动的几个注意事项吧。
1.在没有创建MainActicity时要现在src目录下添加一个Package(包),使用的默认包名要和项目名一致。
2.活动创建完成后在res/layout目录下创建新的Android XML File(布局文件)
3.重写活动的onCreate并且传入布局文件 setContentView(R.layout.XXXX);
4.在AndroidManifest文件中进行注册,在<application></application填入activity
  注:注册活动时有许多注册声明,例如label不仅为标题栏里的内容,还是Launcher(启动器)中应用程序显示的名称。
    而其中的较为特殊,它里面包含了action和catgory的相关信息,这里我们一会再说。

活动之间——intent

  大多数应用都是由多个活动构成的,而他们之间则可以使用intent进行连接。
  Intent具体是个什么东西我现在也不是很清楚,书上说他是一种意图,intent的中文直译为目的,可以被用于启动活动,服务,发送广播等等用途,然而在这里我只知道他可以进行启动活动,我想这个问题在以后的日子可以进行解决。

显式intent

  Intent的用法大致分为两种,显式Intent和隐式intent,这里我们先讨论显示Intent。
  显式Intent的意思就是意图很明显的目的,举个例子来说。
  我想从A点到B点,这就是一个意图很明显的目的,而换到android开发里的Intent上面变成了:
  Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
  startActivity(intent);
  这个intent(意图)便是从FirstActivity到SecondActivity,然而意图仅仅是意图,并没有付之于行动,所以这里用startActivity来执行这个意图。

隐式intent

  顾名思义,隐式intent则是不告诉你具体目的,只是告诉你相关信息,就比如有人向你打听人的时候告诉你这个人的相貌特征,然后你在你的记忆力去找人和这些相关信息进行匹配。虽然是找人,但并不知道这个人的具体名字,而是通过特征去查找,这便是一个隐式的意图。在这里便提到了活动的长相——Intent-filter。就比如我在AndroidManifest里的SecondActivity下定义一个intent-filter:

activity android:name=".SecondActivity"
            android:launchMode="singleInstance">
            <intent-filter >
                <action android:name="com.example.activitytest.ACTION_START"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <category android:name="com.example.activitytest.MY_CATEGORY"/>
            </intent-filter>
        </activity>

其中android:inent.category.DEFAULT为默认的category,调用startActivity时会自动将这个category添加到Intent中。
修改FirstActivity中按钮的点击事件:

public void onClick(View arg0) {
                Intent intent=new Intent("com.example.activitytest.ACTION_START");//隐式intent
                intent.addCategory("com.example.activitytest.MY_CATEGORY");//利用category缩小范围
                startActivity(intent);
            }
        });

隐式Intent的更多用途

  就我现在的理解来看,隐式Intent主要用于多个应用程序之间的功能共享,比如你需要打开一个网站,只需要调用一个浏览器就可以了,而不是自己重新写一个:

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

这里intent的action是Intent.ACTION_VIEW是andfoid系统内置的动作,其常量为android.intent.action.VIEW,然后用Uri将网址字符串解析成Uri对象,用setData方法传进去。
在我的收藏中有几个常用的intent介绍,可以进行查阅:
http://blog.csdn.net/playboyanta123/article/details/7913679

向下一个活动传递数据

  启动活动时传入数据的思路很简单,通过intent.putExtra(“键”,值);的方式将数据暂存到intent中。
  发送:

String data = "Hello Android"
Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
intent putExtral("extra_data",data);
startActivity(intent);

接收:

Intent intent = getIntent();//得到用于启动SecondActivity的Intnet
String data = intent.getStringExtra("extra_data");//用getStringExtra方法得到传递的数据。

返回数据给上一个活动

返回活动只需要按下Back键就可以了,而我们想要返回一个数据就需要startActivityForResult方法,这个方法也是用于启动活动的,但是这个方法在于活动销毁时可以返回一个结果给上一个活动。
  启动SecondActivity:

public void onClick(View v){
    Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
    startActivityForResult(intent,1);  //1为请求码,只要是唯一值就可以了
}

  SecondActivity:

public void onClick(View v){
    Intent intent = new Intent();
    intent.putExtra("data_return","Hello Android");
    setResult(RESULT_OK,intent);//处理结果,数据
    finish();
}

我们这里构建的Intent只有一个传递数据的作用而没有任何”意图“,然后调用setResult方法,这个方法专门用于向上一个活动返回处理结果。
注:在使用startActivityForResult()方法启动SecondActivity时,SecondActivity被销毁后会回调上一个活动的onActivityResult()方法,所以我们要在上一个活动中重写这个方法来得到返回的数据:

@Override             //           请求码(1)  处理结果(RESULT_OK)  携带返回数据的intent
    protected void onActivityResult(int requestCode,int resultCode,Intent data){
            switch(requestCode){
            case 1:
                if(resultCode == RESULT_OK){
                    String returnedData = data.getStringExtra("data_return");
                }
                break;
            default:
            }

活动的启动模式

  Android的活动是使用Task(任务)进行管理的,一个任务就是一组存放在栈里的活动的集合,这个栈就是Back Stack(返回栈)。
  在默认情况下,每当我们启动了一个新的活动,他会在返回栈中入栈,并处于栈顶的位置,而每当我们按下Back或调用finish()方法销毁一个活动时,处于栈顶的活动会出栈。这时前一个入栈的活动就会处于栈顶位置,系统则会显示出栈顶的活动。
  这就是最基本的standard(默认)启动模式,而开发者只需要在AndroidManifest中的相应Activity中进行修改就可以改变活动的启动模式。
  例如:android:launchMode = "singleTop"
  
  下面就给大家介绍其他三种特殊的启动模式。

single Top

  在启动活动时如果发现返回栈的栈顶已经是该活动,则认为可以直接用它,而不会再次创建新的活动实例,但是如果活动不在返回栈栈顶则依然会建立新的活动实例。

single Task

  每次启动该活动时系统首先会在返回栈中检测是否存在该活动的实例,如果发现已存在的则直接使用。

singleInstance

  当活动指定为singleInstance模式后会启动一个新的返回栈来管理这个活动,不管是哪个应用来访问这个活动,都共用这一个返回栈,其主要作用在于活动的共享。就比如依次打开First、Second、ThirdActivity,SecondActivity使用了SingleInstance的启动模式,而FirstActivity和ThirdActivity使用的是默认standard,前者和后两者就不是同一个返回栈,当ThirdActivity按下Back键时会直接返回FirstActivity,再次按下Back键才会返回到SecondActivity,因为SecondActivity和其他二者不在一个返回栈中,第一个返回栈空了之后才会检索第二个返回栈。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值