Android学习-四大组件(Activity)

来源:互联网 发布:jquery加载js 编辑:程序博客网 时间:2024/05/17 02:28

今天开始复习四大组件,也当做个笔记

创建一个Activity

首先在res/layout创建好布局文件activity_main.xml,然后在src中对应package中创建Activity,然后在onCreate()里面调用setContentView()导入对应的布局id,最后在AndroidManifest中配置好。

Tips:

Android四大组件都要在AndroidManifest中进行注册

使用Intent启动Activity

显式Intent

一、setClass(Context,Class)
context指的是上下文,指的来源的activity,class是指的要调用的activity.class,如

Intent intent=new Intent();intent.setClass(A.this,B.class);startActivity(intent);

当然,平时用得更多的是在新建Intent的时候直接传入参数

Intent intent=new Intent(A.this,B.class);startActivty(intent);

三、setClassName()
setClassName()有两种重载,分别是setClassName(packageContext, className)和setClassName(packageName, className)
第一种setClassName(packageContext, className)
第一个参数和上面一样,第二个是要调用的Activity的包名+activity的名字,如

intent.setClassName(A.this,"com.example.intent.B");

这种方式只能调用同一程序的其他Activity
第二种setClassName(packageName, className)
第一个参数是要调用的Activity所在的程序的程序包名,是在AndroidManifest里面设置的程序包名,而不是src中的包名,第二个参数就是src包名+Activity名字,如

intent.setClassName("com.example.activity","com.example.activity1.MainActivity");

这种方式可以调用其他程序的某个Activity

隐式Intent

不明确指出要调用的Activity的名字以及所在程序的包名等等。通过设置过滤条件,然后由系统筛选出那些程序的Activity满足过滤条件,可以直接被调用,比较常见的场景就是打开某个链接,系统弹出对话框选择有哪个程序来打开。首先要在被调用的Activity的AndroidManifest中设置好条件

<activity android:name="com.example.intent.A">    <intent-filter>        <action android:name="myaction"/>        <category android:name="mycategory"/>        <category android:name="android.intent.category.DEFAULT">

然后在使用Intent调用的时候把筛选条件添加进去就行了

Intent intent=new Intent();intent.setAction("myaction");intent.addCategory("mycategory");startActivity(intent);

此时,如果有其他程序的某个Activity也配置了相同的action和category,那么就会让用户做出选择通过哪个程序来启动

Intent日常使用

通过Intent来传递数据

比如在Activity01中启动Activity02,并要传递一个String字符串到Activity02中,那么在Activity01新建Intent的时候可以把要传递的字符串传入Intent中

Intent intent=new Intent(A.this,B.class);intent.putExtra("data","你好");//第一个参数是键值,相当于该数据的标签startActivity(intent);

然后在Activity02中来接收

Intent intent=getIntent();String data=intent.getStringExtra("data");

也可以使用Bundle

Intent intent=new Intent(A.this,B.class);Bundle bundle=new Bundle();bundle.putString("data","你好");bundle.putInt("number",2333);intent.putExtras(bundle);startActivity(intent);

使用Bundle传入数据的时候要选择对应数据类型的方法来传入,而用Intent的时候则是直接使用putExtra()

接下来在目标Activity中接收

Intent intent=getIntent();Bundle bundle=intent.getExtras();String data=bundle.getString("data");int i=bundle.getInt("number");

使用Bundle直接get类型,后面不用加Extra

通过Intent来返回数据

从Activity02中返回数据给Activity01,比如返回一个字符串,Android有个方法叫startActivityForResult(),用来启动活动,并且接收后面返回的数据,startActivityForResult()比startActivity()多一个参数,用来表示请求码,那么把之前的代码做修改,先建一个常量来表示请求码

private static final int GET_DATA=1;......Intent intent=new Intent(A.this,B.class);startActivityForResult(intent,GET_DATA);

然后在Activity02来返回数据,设定按back键销毁Activity02的时候返回数据,重写onBackPressed()方法

@Overridepublic void onBackPressed(){    Intent intent=new Intent();    intent.putExtra("data","你好");    setResult(RESULT_OK,intent);//第一个参数表示返回是否有结果,第二个就是包含数据的Intent    finish();}

Activity01中,会有onActivityResult()方法来接收数据,所以要重写它来进行数据处理

@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {    switch (requestCode) {    case GET_DATA:        if (resultCode == RESULT_OK) {//判断是否有结果            String data1 = data.getStringExtra("data");        }        break;    default:        break;    }}

Activity的生命周期

这里写图片描述
官方文档中的Activity生命周期图
通常在onCreate()中来配置UI等等
在onPause()里执行

  • 停止动画或者是其他正在运行的操作等消耗CPU资源的行为
  • 提交缓存(比如草稿)
  • 释放之前的资源,比如MediaPlayer.stop()和MediaPlayer.release()

为Activity创建目录

首先在res目录下新建一个铭文menu的文件夹,里面用于存放目录的布局文件,新建main.xml

<?xml version="1.0" encoding="utf-8"?><menu xmlns:android="http://schemas.android.com/apk/res/android" >    <item //向目录里面添加子选项        android:id="@+id/add_item"        android:title="@string/add_item"/>    <item         android:id="@+id/remove_item"        android:title="@string/remove_item"/>    <item         android:id="@+id/logout_item"        android:title="@string/logout_item"/></menu>

然后在MainActivity里面加载

public boolean onCreateOptionsMenu(Menu menu) {        // TODO Auto-generated method stub        getMenuInflater().inflate(R.menu.main, menu);//第二个参数表示要往哪一个Menu对象上加载布局,这里就写传入进来的menu        return true;//menu可显示    }

调用getMenuInflater()方法得到MenuInflater对象,再调用MenuInflater对象的inflate()方法来加载配置好的布局。然后再调用onOptionsItemSelected()方法来为每一个item设置点击事件

@Override    public boolean onOptionsItemSelected(MenuItem item) {        // TODO Auto-generated method stub        switch (item.getItemId()) {        case R.id.add_item:            Toast.makeText(this, "你点击了添加", Toast.LENGTH_SHORT).show();            break;        case R.id.remove_item:            Toast.makeText(this, "你点击了删除", Toast.LENGTH_SHORT).show();            break;        case R.id.logout_item:            Toast.makeText(this, "你点击了注销", Toast.LENGTH_SHORT).show();            break;        default:            break;        }        return true;    }

这样就可以在ActionBar上使用目录了。

0 0
原创粉丝点击