大创项目个人周报(2024.7.22—2024.7.28)
本周个人情况汇报
我本周主要学习了安卓开发的内容,根据《第一行代码Android》开展了学习。
一、分析自己的第一个Android程序
- 通过看书,我对项目的各个文件的功能有了大致了解,除app目录外,大多数文件和目录是自动生成的,app目录是今后开发工作主要涉及的部分。app的结构如下。
- 通过学习,我了解了项目运行的具体流程,详解了项目中的资源,并且学习掌握日志工具的使用。
二、学习Activity的使用
- Activity是可以包含用户界面的组件,主要用于和用户进行交互。
我手动创建了Activity并且学习创建和加载布局文件。
按钮
在此编辑器里,通过XML文件编辑布局,添加一个按钮
<Button
android:id="@+id/button1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Button 1"
/>
在Activity中加载布局
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.first_layout)
}
在AndroidManifest文件中注册,以使Activity生效
<activity
android:name=".FirstActivity"
android:exported="true"
android:label="This is FirstActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
效果如下
Toast
- Toast是 Android 系统提供的一种非常好的提醒方式,在程序中可以使用它将一些短小的信息通知给用户,这些信息会在一段时间后自动消失,并且不会占用任何屏幕空间。
在onCreate中添加代码
val button1: Button = findViewById(R.id.button1)
button1.setOnClickListener {
Toast.makeText(this, "You clicked Button1", Toast.LENGTH_SHORT).show()
}
效果如下
菜单
在res目录下新建menu文件,添加代码
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/add_item"
android:title="Add"/>
<item
android:id="@+id/remove_item"
android:title="Remove"/>
</menu>
在FirstActivity中添加代码以使菜单显示并响应
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
menuInflater.inflate(R.menu.main, menu)
return true
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
R.id.add_item -> Toast.makeText(this, "You clicked Add", Toast.LENGTH_SHORT).show()
R.id.remove_item -> Toast.makeText(this,"You clicked Remove", Toast.LENGTH_SHORT).show()
}
return true
}
效果如下
销毁Activity
- 将button1.setOnClickListener中的代码改作
finish()
即可在按下按钮后销毁Activity。
Intent
-
Intent 是 Android 程序中各组件之间进行交互的一种重要方式,它不仅可以指明当前组件想要执行的动作,还可以在不同组件之间传递数据。Intent一般可用于启动Activity、启动 Service以及发送广播等场景。书中本节所讲,即启动Activity。
-
显式Intent方法如下
首先创建SecondActivity,将布局代码替换如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/button2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Button 2" />
</LinearLayout>
修改FirstActivity中的点击事件
button1.setOnClickListener {
val intent = Intent(this, SecondActivity::class.java)
startActivity(intent)
}
执行程序,效果即点击Button1后自动跳转到Button2.
三、本周遇到的问题及利用chatGPT等AI工具的解决过程
在AndroidManifest文件中手动注册,以使Activity生效
<activity
android:name=".FirstActivity"
android:label="This is FirstActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
这一部分中,我的代码与书中示例的代码有不同,多了一句android:exported="false"
,而在我试图不改变这句代码,直接加进去其他代码,系统报错无法编译。故询问AI。
AI:
"android:exported="false" 用于控制一个活动是否可以被其他应用所启动。当设置为 "false" 时,表示该活动只能在启动它自身应用的上下文中被访问。也就是说,只有从同一个应用内部的其他活动、服务或广播接收器才可启动该活动。当设置为 "true",则表示该活动可以从其他应用进行启动。
如果你将一个活动的 android:exported 属性设置为 "false",那么从外部应用点击链接或通过其他应用的广播等方式都无法启动该活动。这种设置通常用于保护敏感功能,例如隐私相关的设置页面、支付页面或权限请求界面,防止外部应用滥用或不小心触发这些功能。
例如,假设你有一个活动专门用于显示用户的个人资料信息。你可能会希望控制只有从应用内部的其他功能(如用户主页或个人资料编辑页面)中启动,以确保用户数据安全和隐私保护。在这种情况下,设置 android:exported="false" 是非常合适的。
然而,在大多数情况下,如果一个活动需要被其他应用访问或启动,例如一些基本的用户界面活动(如主页、列表浏览等),通常会将其设置为 "true",以便提供更好的用户体验和应用集成。
我遂将false改作true,运行正常。