抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

参考自Google官方教程:

https://www.youtube.com/watch?v=3dsAuLkDTUc&list=RDCMUC8QMvQrV1bsK7WO37QpSxSg&index=2

1 activaty及UI窗口

这个是activity_main.xml文件中的TextView组件的内容,可以看到他定义了最基本的长和宽,还有显示的字符串,他构成了一个最基本的前端组件,但是我们的AS会报红This view is not constrained,因为这个组件没有定义上下距离边框或者某个组件的距离

1
2
3
4
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Let's Shop for Food"/>

这里是我们的MainActivay,主要代码的运行位置

AppCompatActivity 类是一个activay类,activaty指的是每一个手机上可见的窗口,所有可见的窗口都是一个activaty类,因此,我们可以创建很多个activaty,但是这么多activaty只有一个是主activaty,至于哪个是主activaty,哪个是其他的activaty我们定义在AndroidManifest.xml,后面会有演示。

onCreate :当一个activate被用户看见的时候,activaty会调用onCreate方法,主要是刷新出显示界面,可以看到onCreate方法继承了super.onCreate(savedInstanceState)。

setContentView(R.layout.activity_main) :setContentView是把我们在xml中定义的UI显示出来,但是要刷新哪个xml呢,R.layout.activity_main 指的是res/laout/activaty_main.mxl文件,也就是说通过这个方法读到了UI界面的xml文件

1
2
3
4
5
6
7
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContentView(R.layout.activity_main)
}
}

然后使我们的AndroidManifest.xml 文件,文件中定义了所有的activaty,只有在这个文件中注册activaty,才会被系统读取。比如以下是主activaty的注册过程,其中android:name=".MainActivity" ,让程序知道我们的主activaty文件在MainActivity.kt中。

而intent-filter和category指的是把该activaty定义为主activaty。

1
2
3
4
5
6
7
8
9
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

而对于一个普通的activaty是没有intent-filter的

1
2
3
<activity
android:name=".MainActivity2"
android:exported="false" />

2 intens解析

activaty是我们所有能看得到的界面的集合,那么我们所看不到的数据是以一个什么样的形式进行传递和定义的呢。我们就要开始讲一讲intens的作用了,Intens相当于一个信号,比如你的手机有两张SIMD卡,在你按拨号键时,Interns找到了两张卡,会让你选择使用哪张卡进行拨号。总而言之,intens是处理所有后端看不到的数据的。

举以下例子

1
2
3
4
5
6
7
8
9
10
11
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//intens代码
val uri:Uri = Uri.parse("http://www.google.com")
val it:Intent = Intent(Intent.ACTION_VIEW,uri)
startActivity(it)

}
}

我们先创立了一个URL,然后把URL给了Intent对象,然后启动这个Intent。所以当我们运行代码时,会首先出现在xml中定义的Let's Shop for Food 然后顺序执行到Intent,会自动跳转到google页面,如下图。

Untitled

如果你的intens是一个http网页,手机会自动寻找默认浏览器打开,如果是一个gro经纬度,手机会自动打开默认手机地图,intens会自动解析你传入的数据格式,这个就叫做intens解析。

Untitled

3 收发消息

有两种消息的定义模式

Data:普通的消息,比如我们上面定义的URI,除了Extras类型全部都是Data数据。

Extras:该数据被保存在Bundle类里,可以再页面之间进行传输,只有在该APP被销毁(关机或者退出程序),Bundle内容才会消失,也就是说Bundle充当了一个buffer的作用。

a 发送

传输消息应该用如下格式

1
2
3
4
5
6
7
val intent = Intent(this, FirstActivity::class.java)
//发送一个链接
intent.setData(
Uri.parse("htt://www.google.com"))
//传送一个文路径
intent.setData(
Uri.fromFile(new File("/sdcard/sample.jpg")))

如果要传送Extras,应该使用如下格式

1
2
3
4
5
6
putExtra(String name,int value)
=> intent.putExtra("level",406)
putExtra(String name,String[] value)
foodList = {"Rice",....}
=> intent.putExtra("food",foodList)
putExtra(bundle)

可以看出来,使用Extra传送参数类似一个键值对,第一个输入是对后面参数起的名字,后面是要传送的参数

b接收

1
2
3
intent.getData()
intent.getIntExtra("level",0)
intent.getExtras()

c 返回数据的流程

要使用startActivityForResult()启动第二个窗口

  • 从第二个activaty返回数据你需要
  • 创建一个新的Intent
  • 把返回的数据放到putExtra()中
  • 把结果返回给Activity.RESULT_OK或者RESULT_CANCELED
  • 调用finish()关闭activaty

调用第一个activaty的onActivityResult()方法(这个方法我们上面讲过,是显示UI时用的)

我们举一个代码的例子

首先调用startActivityForResult()

1
2
3
val int CHOOSE = 1
val it:Intent = Intent(this , ChoosefoodActivity.class)
startActivityForResult(it,CHOOSE)

然后我们返回数据

1
2
3
4
5
6
7
8
//创建一个intens对象
val it:Intent = Intent()
//把返回数据放到里面
it.putExtra(EXTRA_REPLY,reply)
//设置activaty的结果为RESULT_OK
setResult(RESULT_OK,relyIntent)
//结束当前Activity
finish()

调用结束信号onActivityResult()

(这里是Java代码)

1
2
3
4
5
6
7
8
pulic void onActivityResult(int requestCode,
int resultCode,Intent data){
super.onActivityResult(requestCode,resultCode,data);
if(requestCode == TEXT_REQUEST){//定义Activity
if(resultCode == RESULT_OK){//Activity成功
String reply = data.getStringExtra(SecondActivity.EXTRA_REPLY);
// ... 对你的数据进行处理
}}}

后面会有详解

评论