目录
第二讲
添加意图
在添加意图之前的准备工作:目前只有一个窗口,因此要新建一个(?),可以叫SecondActivity,具体方法如下
那么这就相当于新的一个界面了,在新的界面中,我们可以看到与之前的初始界面一样的onCreate,里面同样有
setContentView(R.layout.activity_second);//加载布局
我们可以看到Mainifests文件中,AS已经帮我们创建好第二个活动了
<activity android:name=".SecondActivity"></activity>
分析第一个活动的信息:
<!-- 间接寻址 -->
<activity android:name=".MainActivity">
<!-- 意图过滤器 -->
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<!--主Activity-->
<category android:name="android.intent.category.LAUNCHER" />
<!--发射器,应用程序中首先调被启动的-->
</intent-filter>
</activity>
我们也可以仿照设计第二个活动
显示Intent
我们想要的功能是点击按钮打开第二个页面
在点击按钮那里添加
//显示Intent,指名道姓的说想要调用那个意图
Intent intent=new Intent(MainActivity.this,SecondActivity.class);
//意图自己不会启动,手动启动
startActivity(intent);
隐式Intent
在Mainifest中添加:
<activity android:name=".SecondActivity">
<intent-filter>
<action android:name="android.intent.action.START_ACTION"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
其中,action_name可以自己起(?)
在MainActivity处添加:
//隐式Intent
Intent intent=new Intent("android.intent.action.START_ACTION");
//第一个参数为活动名,最好复制,第二个为category,因为是default所以不写
startActivity(intent);
通过隐式Intent调用系统应用
以拨号为例
//通过隐式Intent调用系统应用
Intent intent =new Intent();
intent.setAction(Intent.ACTION_CALL);//调用拨号系统应用
intent.setData(Uri.parse("tel:15665869115"));//给他数据
startActivity(intent);
运行发现报错
查看错误信息
发现是没有申请用户权限,在Mainifest中,application外面添加:
<!-- 向用户申请打电话的权限 -->
<uses-permission android:name="android.permission.CALL_PHONE"/>
再次运行,发现还是不报错,原因是我们没有在手机中打开权限,app只是申请了,但是我们没有给他
在设置的应用权限中找到应用,在所有应用中找到,我们的app给他打开打电话的权限即可
再次运行成功
intent.setAction(Intent.ACTION_DIAL);//调用拨号系统应用
DIAL和CALL的区别如图:
一些诸如此类的调用
- 打开设置窗口
intent.setAction("android.settings.SETTINGS");//打开设置
- 打开联系人列表
intent.setAction("com.android.contacts.action.LIST_CONTACTS");//打开联系人列表
具体其他的可见文档。
用Intent传递数据
用到的是intent.putExtra()
可以看到有很多的重载方法
Main向SecondActivity传递
在Main中添加显示Intent如下:
Intent intent=new Intent(MainActivity.this,SecondActivity.class);
intent.putExtra("Data","Hello SecondActivity");//名为Data,值为"Hello SecondActivity"
startActivity(intent);
这只是完成了传出,同时SecondActivity还要接受
//新建intent但是不用new,是getIntent(),接收来自intent的数据
Intent intent = getIntent();
//接收名称为Data的数据
String data=intent.getStringExtra("Data");
//用日志打印一下检验是否接收成功,标签,传递的(显示的)数据
Log.d("SecondActivity",data);
日志信息如下
从SecondActivity向Main传递
Main中添加:
Intent intent=new Intent(MainActivity.this,SecondActivity.class);
startActivityForResult(intent,1);//1是用来区别请求和响应的
同时接收
@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 resultData = data.getStringExtra("data_return");
Log.d("MainActivity", resultData);
}
break;
}
}
而SecondActivity作为发送方,需要在按钮添加监听以达到点击跳转并发送数据的目的:
/*
初始化窗口
*/
public void initView(){
button2 = findViewById(R.id.button2);
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);//RESULT_OK=-1
finish();//关闭窗口
}
});
}
别忘了将initView方法添加到onCreat方法中。
可以看到运行: