《第一行代码》第二版学习笔记(1)——初识Android开发和活动组件

安卓萌新小愈伤来报道啦!

一、安卓项目基本框架

使用XML标记描绘应用界面,使用Java代码书写程序逻辑。
在这里插入图片描述

想要观察APP的运行效果,有两种方法:

  • 在模拟器上运行APP应用
  • 使用真实手机调试App

PC和真机或者模拟器上的Android OS怎么联系起来的,通过adb(Android debug bridges)进行调试通信
在这里插入图片描述
在实际开发中,90%的情况是用模拟器,在模拟器上可以做不同版本的兼容性测试。

App 开发主要有两大技术路线,分别是原生开发和混合开发。
混合开发会借助前端、flutter、网页技术等。劣势是渲染性能没有原生开发好,好处是可以跨平台,版本更新不需要重新下载API文件

二、Android 工程目录结构

每个项目至少有一个模块,也能拥有多个模块,一般编译运行APP指的是运行某个模块,而非运行某个项目。
在这里插入图片描述
在这里插入图片描述
项目级别的build.gradle指定了当前项目的总体编译规则。
模块级别的build.gradle对应于具体模块,每个模块都有自己的build.gradle,它指定了当前模块的详细编译规则。

在这里插入图片描述
Gradle是一个项目自动化构建工具,帮我们做了依赖、打包、部署、发布、各种渠道的差异管理工作。
在这里插入图片描述

三、日志级别

在这里插入图片描述

四、创建新的APP页面(Activity活动)

  • 在layout目录下创建XML文件,这个是布局文件,默认会生成一个id,存储在资源R中。在该文件中加入按钮,文本等标签,每个标签都有id,自己命名。
  • 创建与XML文件对应的Java代码,一般命名为XXXActivity.class,一定会继承Activity类或者Activity的子类。重写onCreate方法,在onCreate方法中首先获取对应的XML文件的id,就可以使用这个文件中的控件了,在使用控件之前需要获取控件的id。
  • 在AndroidMainfest.xml中注册页面配置

在XML中引用一个id,就使用@id/id_name,在XML中定义一个id,则要使用@+id/id_name

五、活动之间的跳转

显示响应跳转
1、在Intent的构造函数中,传递两个参数,一个参数表示跳转的来源页面 XXX.this;第二个参数表示待跳转的页面,即YYY.class.

 Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
 startActivity(intent);

2、调用intent对象的setClass方法指定

Intent intent = new Intent();
intent.setClass(this,ActNextActivity.class);

3、调用intent对象的setComponent方法指定

Intent intent = new Intent();
ComponentName component = new ComponentName(this,ActNextActivity.class);
intent.setComponent(component);

隐式响应跳转
没有明确指定要跳转的目标活动,只给出一个动作字符串让系统自动匹配,属于模糊匹配。
常见的系统动作取值说明:
在这里插入图片描述
用setData和addCategory方法指定具体的信息。每一个Intent中只能指定一个action,但能指定多个category

  • 打开AndroidMainifest.xml,通过在标签下配置的内容,可以指定当前活动能够响应的action和category。如:
<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标签中指明了能够响应com.example.activitytest.ACTION_START这个action,并且能够响应的intent中可能带有category

  • 修改FirstActivity中的点击事件,在intent的构造函数中将action的字符串传入进去,表明我们想要启动能够响应com.example.activitytest.ACTION_START这个action的活动。这个category:android.intent.category.DEFAULT是一种默认的category,在调用startActivity方法的时候会自动将这个category添加到Intent中。
button1.setOnClickListener(new View.OnClickListener(){
	@Override
	public void onClick(View v){
		Intent intent = new Intent("com.example.activitytest.ACTION_START");
		startActivity(intent);
	}
});

只有he 标签中的内容能够同时匹配上Intent中指定的action和category时,这个活动才能响应该intent。如果不是用默认的category,则在启动活动中使用intent.addCategory(“标签中的内容”);

六、数据传递

1、向下一个活动传递数据

putExtra方法将想要传递的数据暂存在intent中,putExtra(键,数据);

 button1.setOnClickListener(v -> {
     String data = "hello secondActivity";
     setContentView(R.layout.second_layout);
     Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
     intent.putExtra("extra_data",data);
     startActivity(intent);
 });

在下一个活动中将传递的数据取出来,调用intent的getStringExtra方法,传入相应的键值,就可以得到相应的数据了。如果传递的是整数型数据,则使用getIntExtra方法。

Intent intent = getIntent();
String data = intent.getStringExtra("extra_data");
assert data != null;
Log.d("SecondActivity",data);

2、返回数据给上一个活动

活动中接收启动活动返回的数据:

ActivityResultLauncher<Intent> register = registerForActivityResult(
   new ActivityResultContracts.StartActivityForResult(),
    new ActivityResultCallback<ActivityResult>() {
        @Override
        public void onActivityResult(ActivityResult o) {
            Intent intentData = o.getData();
            // 接收活动的返回值
            String response = intentData.getStringExtra("response");
            tv_send.setText(response);
        }
    });


//新建一个ActivityResultLauncher对象,以这种方式启动活动可以收到活动的返回值,
findViewById(R.id.button_1).setOnClickListener(v -> {
	Intent intent = new Intent(ActSendActivity.this,ActReceiveActivity.class);
	intent.putExtra("name",tv_send.getText().toString());
	register.launch(intent);
});

销毁启动活动并返回数据

button2.setOnClickListener(v -> {
    Intent intent1 = new Intent();
    intent1.putExtra("data_return","hello FirstActivity!");
//            setResult()方法专门向上一个活动中返回数据,
//            参数1:处理结果,OK或者CANCELED  参数2:带有数据的intent
    setResult(RESULT_OK,intent1);
    finish();
});

七、Avtivity生命周期

在这里插入图片描述

onSaveInstanceState方法保证活动在回收前一定会被调用,可以通过这个方法解决活动被回收时临时数据得不到保存的问题

八、活动的启动模式

启动模式一共有四种:standard,singleTop,singleTask,singleInstance,可以在AndroidManifest.xml中通过给标签指定的android:launchMode属性来选择启动模式。

  • standard
    默认的启动模式,在不进行显示指定的情况下,所有活动都会自动使用这个启动模式。在该模式下,每当启动一个新的活动,它就会在返回栈中入栈,并处于栈顶的位置。系统不会管这个活动是否存在栈中,每次启动新的活动都会创建一个该活动的实例。

  • singleTop
    在启动活动的时候如果发现该活动在栈顶,则直接使用他,不会在创建新的活动。

  • singletask
    在启动活动时,检查栈中存在该活动,如果栈中存在活动,则把这个活动之上的活动统统出栈,如果没有就会创建一个新的活动实例。

  • 11
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值