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