一、第一个Activity
1.1 创建一个空Activity
1.2 创建一个布局
知识点
在XML中引用一个id:@id/id_name
在XML中定义一个id:@+id/id_name
右键错误,点击Show Quick-Fixes
,再点击弹出的Suppress:Add........
,错误会被自动修复
1.3 在AndroidManifest.xml文件中注册
现在程序就可以运行了
1.4 在活动中使用Toast
Toast:显示短小的信息,起到提醒作用
(不必纠结此处代码的语法)
效果:
1.5 在活动中使用Menu
回到FirstActivity,重写onCreateOptionsMenu()
方法【按下Ctrl+o
,可生成部分代码】
此时菜单就可正常打开了
之后为菜单添加事件
在FirstActivity中重写onOptionsItemSelected()
方法【操作方法同上】
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
if (item.getItemId() == R.id.add_item) {
Toast.makeText(this,"你点击了add",Toast.LENGTH_SHORT).show();
}else if(item.getItemId()==R.id.remove_item){
Toast.makeText(this,"你点击了remove",Toast.LENGTH_SHORT).show();
}
return super.onOptionsItemSelected(item);
}
效果如下:
1.6 销毁一个活动
- Android中的Back按键【就是返回键】
- Activity类中的finish()方法
第二种,把finish()方法写进button1中,之后点击button1,活动就会关闭
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();//点击button1,活动就会关闭
}
});
二、活动之间的切换(Intent)
Intent
- 可以指明当前组件想执行的动作
- 可以在不同组件之间传递数据
2.1 显式Intent
启动SecondActivity
新建一个名为SecondActivity
的Activity
修改FirstActivity中button1的代码,使其能启动SecondActivity
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//启动SecondActivity
Intent intent=new Intent(FirstActivity.this, SecondActivity.class);
startActivity(intent);
}
});
效果如下
2.2 隐式Intent
隐式Intent不知名我们要启动哪一个活动,系统分析这个Intent,之后帮我们找出合适的活动去启动。
- 合适的活动:可以 响应 该隐式Intent的活动
注意
- < action >和< category >同时匹配时,才可响应
- 每个Intent只能指定一个action,却可以指定多个category
默认的category
修改SecondActivity的 < Activity >标签
修改FirstActivity中button1的代码,使其能启动SecondActivity
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//启动SecondActivity
Intent intent=new Intent("com.example.noactivity.ACTTION_START");//不需要添加category,因为刚才xml中的是默认category
startActivity(intent);
}
});
之后启动,点击FirstActivity中button1,能启动SecondActivity
不用默认的category
修改SecondActivity的 < Activity >标签
修改FirstActivity中button1的代码,使其能启动SecondActivity
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//启动SecondActivity
Intent intent=new Intent("com.example.noactivity.ACTTION_START");
intent.addCategory("com.example.noactivity.MY_CATEGORY");//指定的category
startActivity(intent);
}
});
之后启动,点击FirstActivity中button1,能启动SecondActivity
2.2 隐式Intent【打开浏览器】
修改FirstActivity中button1的onClick()代码
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//指定了Intent的action是Intent.ACTION_VIEW
Intent intent = new Intent(Intent.ACTION_VIEW);
//用Uri.parse(),将网址解析为一个Uri对象。再调用Intent的setData()方法将该Uri对象传进去
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);
}
});
效果
2.3 隐式Intent【新建一个活动,使其能响应打开网站的Intent】
- < intent-filter >中可再配置一个< data >标签,可以指定当前活动可以响应什么类型的数据
标签 | 说明 |
---|---|
android:scheme | 协议,如http |
android:host | 主机名,如www.baidu.com |
android:port | 端口,一般紧跟主机名之后 |
android:path | 主机名和端口之后的部分 |
android:mimeType | 指定可以处理的数据类型 |
创建活动,名为ThirdActivity
,布局名为third_layout
。
在third_layout.xml
中添加button
<Button
android:id="@+id/button_3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Button 3"
tools:ignore="MissingConstraints" />
修改AndroidManifest.xml
中ThirdActivity的部分
<activity
android:name=".ThirdActivity"
android:exported="true" >
<intent-filter tools:ignore="AppLinkUrlError">
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="http"/>
</intent-filter>
</activity>
此时ThirdActivity
也可响应button1访问http://www.baidu.com的intent
2.4 隐式Intent【调用系统拨号页面】
修改button按键的onClick()方法。
主要看的是Intent 的action
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(Intent.ACTION_DIAL);
intent.setData(Uri.parse("tel:10086")); //String转Uri,再通过setData()传入intent
startActivity(intent);
}
});
效果
2.5 向下一个活动传递数据
思路:把数据存放在intent中,启动另一个活动后,把这些数据从intent中取出即可
intent.putExtra()
getIntent()
intent.getStringExtra("extra_data")
在FirstActivity中启动SecondActivity
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String data = "Hello SecondActivity";//要发送的数据
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);//intent
intent.putExtra("extra_data",data);//两个参数,(“键”,“要传递的数据”)
startActivity(intent);
}
});
在SecondActivity中取出数据,并打印出来
public class SecondActivity extends AppCompatActivity {
private static final String TAG = "SecondActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second_layout);
Intent intent=getIntent();//获取intent
String data=intent.getStringExtra("extra_data");//键
Log.d(TAG, data);//在logcat中打印数据
}
}
logcat中的数据
2.5 返回数据给上一个活动
startActivityForResult();
:该方法期望在活动销毁时能够返回一个结果给上一个活动putExtra()
setResult()
onActivityResult()
在FirstActivity中启动SecondActivity
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);//intent
startActivityForResult(intent,1);//参数(intent,请求码)
}
});
SecondActivity中button事件。点击后SecondActivity结束,返回数据(在intent中)
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent();
intent.putExtra("data_return","Hello FirstActivity");
setResult(RESULT_OK,intent);//向上一个活动返回数据(数据在intent中)
finish();//结束SecondActivity
}
});
覆写FirstActivity中的onActivityResult()
方法,以获取返回数据
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {//根据请求码,进入不同的分支
case 1:
if (resultCode == RESULT_OK) {
String returnedData = data.getStringExtra("data_return");//根据键值,获取返回数据
Log.d("FirstActivity", returnedData);
}
break;
case 2:
break;
default:
}
}
结果:
参考
第一行代码,郭霖