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()方法去销毁一个活动时,处于栈顶的活动就会出栈。这时前一个入栈的活动就会重新处于栈顶的位置。系统总是会显示处于栈顶的活动给用户

你可能感兴趣的:(Android Activity探究)