【Android学习】《第一行代码》二

工具学习

Posted by Corax on February 3, 2024

​ 因为最近在研究安卓逆向,想着把正向开发的知识给补一补,所以找到了《第一行代码(第二版)》这本书来入安卓开发的门,以知道常规app开发流程及相关信息知识为目的,开始这一系列,近期会把这本书速刷并做完书中项目,和学习安卓逆向的一些技术。

本篇为第二篇的前半部分,就挑些我觉得重要的部分写一些。

本章主要是手动创建一个activity并介绍activity相关参数和声明的知识,还有部分开发常识(例如逻辑和试图分离)。

自建活动

我首先自己创建了一个单活动的app,基本上就是默认的参数。

image-20240205213747202

看看主文件

过程很简单,就是调用父类oncreate和设置布局及文本。

image-20240205213841369

再看看配置清单

看到这里的声明(和书中的android5.0不一样,注意一下。)

image-20240205214001268

手动创建

创建活动

首先是在main里面创建一个空活动。

image-20240205214125129

就有了一个默认的活动代码

public class FirstActivity extends AppCompatActivity {
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 }
}

但是单单如此没有布局的,所以需要自己手动set一下

首先是要创建出这个布局,然后逻辑与之分离

创建布局

如下为布局代码

添加了一个button

image-20240205214647867

<Button
        android:id="@+id/button_1" 新增一个id
        android:layout_width="match_parent" 宽度
        android:layout_height="wrap_content" 长度
        android:text="Button 1" 文本内容
        />

oncreate

好,现在布局代码已完工,需要去oncreate里操作了

可以看到和上面studio自建的代码一样,都是加载了一个布局id

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.first_layout);
    }

AndroidManifest文件中注册

这里是踩坑了,因为安卓版本差异,注册的写法不一样,我环境的版本上面由,书中如下

image-20240205215140773

改进一下

<activity
            android:name=".FirstActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>
            <meta-data
                android:name="android.app.lib_name"
                android:value="" />

        </activity>

现在就可以运行了

image-20240205215406981

在活动中使用Toast

就是一个小小的提醒弹窗

我们让他和原神启动按钮绑定一下

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.first_layout);
        Button button1 = (Button) findViewById(R.id.button_1);findViewById() 方法获取到在布局文件中定义的元素
        button1.setOnClickListener((new View.OnClickListener() { //调用setOnClickListener() 方法为按钮注册一个监听器
            @Override
            public void onClick(View view) {
                Toast.makeText(FirstActivity.this, "有点磕青了",Toast.LENGTH_LONG).show();第一个上下文,第二个字符串,第三个时长
            }
        }));
    }

ok

image-20240205220607187

image-20240205220840050

创建

image-20240205220914217

menu写好了,就是两个菜单项创建一下

<?xml version="1.0" encoding="utf-8"?>
<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>

让menu可以显示

public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate((R.menu.main),menu);//
    //getMenuInflater() 方法能够得到MenuInflater 对象
    //inflate() 方法就可以给当前活动创建菜单
    //第一个参数用于指定我们通过哪一个资源文件来创建菜单
    //第二个参数用于指定我们的菜单项将添加到哪一个Menu
    return true;
}

显示还不够,还要有东西,用的case

public boolean onOptionsItemSelected(@NonNull MenuItem item) {
    switch (item.getItemId()){
        case R.id.add_item:
            Toast.makeText(this, "我是原皮",Toast.LENGTH_LONG).show();
            break;
        case R.id.remove_item:
            Toast.makeText(this, "我是舟皮",Toast.LENGTH_LONG).show();
            break;
        default:    
    }
    return true;
}

成功

image-20240205222453539

image-20240205222503088

image-20240205222514762

销毁活动

正常手机back一下就ok

这里用finish()方法

把按钮作用改掉

button1.setOnClickListener((new View.OnClickListener() {
            @Override
            public void onClick(View V){
                finish();
            }

ok

image-20240205222806836