Android Activity探究

1.活动是什么

Activity 活动是最容易吸引用户的地方,它是一种可以包含用户界面的组件,主要用于和用户进行交互。一个应用程序中可以包含0个或者多个活动,但不包含任何活动的应用程序很少见。

2.活动的基本用法

由于AS在一个工作区间内只允许打开一个项目,因此首先你需要将当前的项目关闭。至于如何创建Activity我就不叙述了。

创建完之后就有一个Activity。项目中的任何活动都应该重写Activity的Oncreate()方法,而目前我们创建的活动基本上已经重写了该方法,是由AS自动帮我们完成的。

Public class MainActivity extends AppCompatActivity{

@Override

protected void onCreate(Bundle savedInstanceState){

super.onCreate(savedInstanceState);

}

}

onCreate()方法非常简单,就是调用了父类的onCreate()方法。当然这知识默认实现。后面还要在加入一些自己的逻辑

3.创建和加载布局

Android程序的设计讲究逻辑和视图分离,最好每一个活动都能对应一个布局。布局就是用来显示界面的内容。因此我们要手动来创建一个布局文件。

XML布局文件创建好之后,我们只需要在super.onCreate(savedInstanceState)下一行加入

setContentView(R.layout.main_layout);

这里调用了setContentView方法来给当前活动加载一个布局。,里面传入的是布局文件的ID;

4.在头文件中注册 (AndroidManifest)

活动的注册声明要放在标签内,这里是通过标签来对活动进行注册的

5.在活动中使用Toast

Toast 是ANdroid系统提供的一种非常好的提醒方式,在程序中可以使用它将一些短小的信息通知给用户,这些信息会在一段时间后自动消失,并且不会占用任何屏幕空间。

首先要定义一个弹出Toast的触发点,我们定义个按钮。

Public class MainActivity extends AppCompatActivity{

@Override

protected void onCreate(Bundle savedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.main_layout);

//控件初始化

Button button1 =  (Button) findViewById(R.id.button_1);

//button1点击事件

button1.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v){

Toast.makeText(MainActivity.this,"You clicked Button 1",Toast.LENGTH_SHORT).show();

}

});

}

}

6.在活动中使用Menu

手机和电脑不同,它的屏幕非常有限。Menu可以让菜单展示的时候不占用屏幕空间

首先在res目录下新建menu文件夹,  文件名输入main

然后在main.xml文件中添加

android:id="@+id/add_item"

android:title="Add" />

然后回到MainActivity中来重写onCreateOptionsMenu()方法,重写可以使用Ctrl+0快捷键

public boolean onCreateOptionsMenu(Menu menu){

getMenuInflater().inflate(R.menu.main,menu);

return true;

}

通过getMenuInfalter(0方法能够得到MenuInflater对象,在调用它的inflate()方法就可以给当前活动创建菜单了。

当然,仅仅让菜单显示出来是不够的,我们定义菜单不仅是为了看的,关键是要菜单真正能用才行,因此还要在定义菜单响应事件。

在MainActivity中重写OnOptionsItemSelected()方法:

public boolean onOptionsItemSelected(MenuItem item){

switch(item.getItemId()){

case R.id.add_item:

Toast.makeText(MainActivity.this,"You clicked ADD ",Toast.LENGTH_SHORT).show();

break;

default:

}

return true;

}

7.销毁一个活动

既然创建了活动,当然要销毁了。其实只要按下Back 键就可以销毁了。

不过你想在程序中销毁也可以

button1.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v){

finish();

}

});

8.使用Intent在活动之间穿梭

Intent大致可以分为两种:显示和隐式

8.1 显示Intent

Intent有多个构造函数的重载,其中一个是Intent(Context packageContext, Classcls).这个构造函数接受两个参数,第一个参数是

context要求提供一个活动的上下文,第二个参数就是指定要启动的活动了,通过这个构造函数就可以构建出Intent的意图.Actvity类中提供了一个startActivity()的方法,这个方法是专门用于启动活动的,它接受一个Intent参数,这里是我们将构建好的Intent传入startActivity()方法就可以启动目标活动了。

button1.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v){

Intent intent = new Intent(MainActivity.this, OtherActivity.class);

StartActivity(intent);

}

});

我们首先构建出了一个Intent,传入MainActivity.this作为上下文,传入OtherActivity为活动目标。

这样我们的意图就非常明显了。然后通过StartActivity方法来执行Intent

就可以实现页面跳转了。

ps:OtherActivity必须在头文件中注册

8.2 隐式Intent

相比于显示Intent,隐式Intent则含蓄了许多,它并不明确指出我们想要启动哪一个活动,而是指定了一系列更为抽象的action和category等信息,然后交由系统去分析这个Intent,并帮我们找出合适的活动去启动

什么叫做合适的活动呢?

通过在标签配置的内容,可以指定当前活动能够响应的action 和 category,打开AndroidManifest.xml,添加如下代码:

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

button1.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v){

Intent intent = new Intent("com.example.activitytest.ACTION_START";

StartActivity(intent);

}

});

可以看到,我们使用了Intent的另一个构造函数,直接将action的字符串传了进去,表面我们想要启动能够响应这个action活动,那category, DEFAULT是一种默认的category.在调用startActivity()方法的时候会自动将这个category添加到Intent中。

每个Intent中只能指定一个Action,但却能指定多个category。

button1.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v){

Intent intent = new Intent("com.example.activitytest.ACTION_START ";

intent。addCategory("com.example.activitytest.MY_CATEGORY");

StartActivity(intent);

}

});

可以调用Intent中的 addCateg()方法来添加一个category,这里我们指定了一个自定义的category,值为com.example.activitytest.MY_CATEGORY..

然后在头文件声明MY_CATEGORY.

8.3更多隐式的用法

使用隐式Intent,我们不仅可以启动自己程序内的活动,还可以启动其他程序的活动。比如需要展示一个网页。

button1.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v){

Intent intent = new Intent(Intent.ACTION_VIEW);

intent.setData(Uri.parse("http://www.baidu.com"));

StartActivity(intent);

}

});

这样就可以启动系统自带的浏览器了

比如电话拨号器:

button1.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v){

Intent intent = new Intent(Intent.ACTION_DIAL);

intent.setData(Uri.parse("10086"));

StartActivity(intent);

}

});

9.活动传递数据

Activity跳转时并且传递数据,或者返回数据给上一个活动

button1.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v){

String data = "hellow world"

Intent intent = new Intent(MainActivity.this,OtherActivity.class);

intent.putExtra("extra_data",data);

StartActivity(intent);

}

});

注意:putExtra()方法接收两个参数。第一个参数是键。第二个参数才是你要传的值。

然后在第二个活动中接收所传递的数据

在Oncreate方法中接收

Intent intent =getIntent();

String data = intent.getStringExtra("extra_data");

Log.d("OtherActivity",data)

返回数据给上一个活动

startActivityForResult()方法接收两个参数,第一个是 Intent,第二个参数是请求码.

用于之后的回调判断数据的来源。

button1.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v){

Intent intent = new Intent(MainActivity.this,OtherActivity.class);

StartActivityForResult(intent,1);

}

});

//在第二个Activity中

.  button2.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v){

Intent intent = new Intent();

intent.putExtra("data_return","Hello MainActivity");

setResult(RESULT_OK,intent);

finish();

}

});

然后在MainActivity中接收返回的数据

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

switch (requestCode){

case 1:

if (resultCode ==RESULT_OK){

String returneData = data.getStringExtra("data_return");

Log.d("MainActivity",returneData);

}

break;

default:

}

}

如果用户是通过Back 来返回的 可以在第二个活动中重写onBackPressed()方法来解决这个问题

@Override

public void onBackPressed() {

Intent intent = new Intent();

intent.putExtra("data_return","Hellwo");

setResult(RESULT_OK,intent);

finish();

}

10.活动的生命周期

10.1返回栈

栈是一种后进先出的数据结构,在默认的情况下,每当我们启动了一个新的活动,它会在返回栈中入栈,并处于栈顶位置。而每当我们按下Back键或调用finish()方法去销毁一个活动时,处于栈顶的活动就会出栈。这时前一个入栈的活动就会重新处于栈顶的位置。系统总是会显示处于栈顶的活动给用户

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容