Intent(多活动)
类似在主活动中嵌套一些其他活动,点进去就打开新的活动,Back就返回上一个活动
1.显示Intent(同一程序内)
①定义一个新的活动SecondActivity.java
(在例子中添加了一个按钮,按下后会有消息提示)
②修改 FirstActivity 中BUTTON 1 对应的代码(连接两个活动)
Button button1 = (Button) findViewById(R.id.button_1);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
startActivity(intent);
Toast.makeText(FirstActivity.this, "别乱按我,按????那个",
Toast.LENGTH_SHORT).show();
}
});
在FirstActivity中定义这样一个按钮,按下之后会转到SecondActivity,并显示消息提示
③效果(按BUTTON 1)----------->
按Back就返回到FirstActivity
2.隐式Intent(同一程序内)
与显示Intent直接声明要启动哪个活动不同,隐式Intent指定了一系列action和category等信息,然后让系统去分析Intent,找出合适的活动去启动(无需人工干预)
①在AndroidManifest.xml中的SecondActivity对应位置添加以下代码:
<activity android:name=".SecondActivity">
<intent-filter>
<action android:name="com.example.activitytest.ACTION_START"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
只有 < action >和< category >中的内容与这里的Intent中声明的action和category匹配成功,这个活动才能响应Intent。(类似一个标签、ID)
②在 FirstActivity 中修改BUTTON 2 的对应代码(连接两个活动)
Button button2 = (Button) findViewById(R.id.button_2);
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("com.example.activitytest.ACTION_START");
startActivity(intent);
Toast.makeText(FirstActivity.this,"按????的吧不要按我了",
Toast.LENGTH_SHORT).show();
}
});
这里活动要响应
action的字符串必须是com.example.activitytest.ACTION_START
category对应的必须是android.intent.category.DEFAULT
因为这里要求的category刚好是默认的所以BUTTON 2 中就没指定,调用startActivity()时会自动添加
③效果跟显示Intent一样
3.其他隐式Intent的用法(不同程序间)
比如打开一个网页
①在FirstActivity中添加一个BUTTON 3 (按了之后会打开百度)
②响应代码如下:
Button button3 = (Button)findViewById(R.id.button_3);
button3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("https://www.baidu.com"));
startActivity(intent);
Toast.makeText(FirstActivity.this,"打开百度",
Toast.LENGTH_LONG).show();
}
});
------------>
对于setData(),可以在< intent-filter >中再配置< data >标签,用于更精确地指定当前的活动能响应什么样的数据类型:
| 标签名 | 用途 |
|---|---|
| android:scheme | 指定数据的协议,如http协议等 |
| android:host | 指定数据的主机名(域名),如www.baidu.com |
| android:port | 指定数据的端口,一般紧跟主机名后 |
| android:path | 指定数据的端口之后的部分 |
| android:mimeType | 指定可以处理的数据类型,允许使用通配符的方式来指定 |
对于Uri.parse(),常见的有:
| 字符 | 用途 |
|---|---|
| https | 打开网页 |
| geo | 打开地图 |
| tel | 打电话/发短信 |
| file | 打开手机对应目录下的文件 |
| mailto | 发邮件 |
4.传递数据给下一个活动
思路:Intent提供了一系列putExtra()方法可以重载,因此可以将我们要传递的数据先暂存在Intent中,等启动了新活动之后,再将数据从Intent中取出即可(FirstActivity —> Intent —> SecondActivity)
举例(显示Intent):
①修改FirstActivity中连接两个活动的代码(加入要传递的消息)
Button button1 = (Button) findViewById(R.id.button_1);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String data = "I want you,SecondActivity.";//新加的
Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
intent.putExtra("extra_data",data);
//新加的,把上面的data放入Intent中,命名为extra_data
startActivity(intent);
Toast.makeText(FirstActivity.this, "别乱按我,按????那个",
Toast.LENGTH_SHORT).show();
}
});
②修改SecondActivity中的代码:(接收FirstActivity想要传递的消息)
Intent intent = getIntent();
final String data = intent.getStringExtra("extra_data");
//定义一个变量data用来接收FirstActivity传过来的消息extra_data
Button button3 = (Button) findViewById(R.id.button3);
button3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(SecondActivity.this,data,Toast.LENGTH_SHORT).show();
//按下按钮的提示信息设置为FirstActivity传递过来的data
}
});
对于final:
(1)在Java中声明属性、方法和类时,可使用关键字final来修饰。
(2)final变量即为常量,只能赋值一次;
(3)final方法不能被子类重写;
(4)final类不能被继承。
与final对应的是staic:
(1)static变量
一种是被static修饰的变量,叫静态变量或类变量,在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配,可用类名直接访问(方便),当然也可以通过对象来访问(但是这是不推荐的)。
另一种是没有被static修饰的变量,叫实例变量,每创建一个实例,分配一次内存,实例变量可以在内存中有多个拷贝,互不影响(灵活)。
(2)static代码块
static代码块是类加载时,初始化自动执行的。如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次。
(3)static方法
static方法可以直接通过类名调用,任何的实例也都可以调用,因此static方法中不能用this和super关键字,不能直接访问所属类的实例变量和实例方法(就是不带static的成员变量和成员成员方法),只能访问所属类的静态成员变量和成员方法。因为static方法独立于任何实例,因此static方法必须被实现,而不能是抽象的abstract。
static方法只能访问static的变量和方法,因为非static的变量和方法是需要创建一个对象才能访问的,而static的变量/方法不需要创建任何对象。
总结:
static的数据或方法,属于整个类的而不是属于某个对象的,是不会和类的任何对象实例联系到一起。所以子类和父类之间可以存在同名的static方法名,这里不涉及重载。所以不能把任何方法体内的变量声明为static,可以这么理解,static只有一个存储地方,使用时直接使用,不需要创建对象,一般的类是没有static的,只有内部类可以加上static来表示嵌套类。
③效果:------------->
返回数据给上一个活动
与传递消息给下一个活动不同,返回数据是通过调用Activity中自带的startActivityForResult(),这个方法也用于启动新活动,不同的是,用此方法启动的活动在销毁时会返回一个结果给上一个活动,第一个参数是intent,第二个参数是请求码,用于判断数据的来源。
思路:在销毁SecondActivity的同时,类似传递消息给下一个活动一样,把要返回的消息先存在intent中,销毁结束后在FirstActivity中再获取。
举例:
①修改FirstActivity中的BUTTON 2 的代码(启动新活动的方法改成startActivityForResult())
Button button2 = (Button) findViewById(R.id.button_2);
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("com.example.activitytest.ACTION_START");
startActivityForResult(intent,1);
//这里请求码设置为1,类似一个定位id,此活动销毁后会返回1
Toast.makeText(FirstActivity.this,"按????的吧不要按我了",
Toast.LENGTH_SHORT).show();
}
});
重写一个onActivityResult()用于接收返回的消息
@Override
protected void onActivityResult(int requestCode,int resultCode,Intent data){
switch (requestCode){
//返回的请求码
case 1:
//如果是1
if (resultCode == RESULT_OK){
String ReturnData = data.getStringExtra("data_return");
//定义ReturnData用于接收返回的消息
Toast.makeText(FirstActivity.this,ReturnData,
Toast.LENGTH_SHORT).show();
//通过消息提示的方式显示返回的数据
}
break;
default:
}
}
②修改SecondActivity中的代码(重写onBackPressed())
@Override
public void onBackPressed(){
Intent intent = new Intent();
intent.putExtra("data_return","I hate you,FirstActivity.");
setResult(RESULT_OK,intent);
finish();
}
③效果:----------->