Android第一行代码--学习笔记(更新中ing)

Posted 电烤牛上脑

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android第一行代码--学习笔记(更新中ing)相关的知识,希望对你有一定的参考价值。

O(∩_∩)O–作者 说:
请原谅我无耻的称自己为作者了!本文是作者看《android第一行代码》然后自己摘抄书上觉得对自己目前有用的内容,目前作者也是刚刚入门学习阶段,如果有错误希望大家多多指正。
PS:为什么我会写这几句没用的东西(因为昨天写的笔记突然好多人看。。。我慌了)只是分享看书而已!
最后,文章尽量日更,每次更新一点今天新学的东西,大家一起加油

Android第一行代码–学习笔记

认识四大组件

⭐️活动Activity

⭐️服务Service

⭐️广播接收器Broadcast Receiver

⭐️内容提供器Content Provider


AndroidMainfest.xml文件

简述:1.程序中定义的所有四大组件,都需要在这个文件里注册

        2.给应用程序添加权限声明

其中:

<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
这两行代码所在Activity,表示此Activity是主活动,点开本程序的入口

build.gradle文件

build.gradle(Project)

buildscript {
    repositories {
        jcenter()    //代码托管仓库
    }
    dependencies {
        classpath "com.android.tools.build:gradle:7.0.2"
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.31"
        //声明gradle插件
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}
allprojects {
    repositories {
        jcenter()
    }
}

build.gradle(Module)

plugins {
    id 'com.android.application'  //这是一个应用程序模块
    id 'com.android.library'  //这是一个库模块
}

android {
    compileSdk 31  //指定项目的编译版本

    defaultConfig {
        applicationId "com.co.test"  //指定项目包名
        minSdk 26  //指定项目最低兼容Android系统版本
        targetSdk 31  //运行时权限
        versionCode 1  //项目版本号
        versionName "1.0"  //项目版本名
    }

    buildTypes {  //用于指定安装文件的相关配置
        release {  //正式
            minifyEnabled false  //是否对项目代码进行混淆
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'  //指定混淆时使用的规则文件
        }
        debug {  //测试
            minifyEnabled false
        }
    }

dependencies {  //指定项目所有的依赖关系  1.本地依赖 2.库依赖 3.远程依赖
      //需要啥用啥就是了。。。
}

Android日志工具Log

⭐️Log.v():用于打印琐碎,意义最小的日志信息

⭐️Log.d():用于打印一些调试信息

⭐️Log.i():用于打印一些比较重要的数据

⭐️Log.w():用于打印一些警告信息

⭐️Log.e():用于打印程序中的错误信息


加载布局的方法

🗡最基础方法

setContentView(R.Layout.home_layout)

Intent

核心:用于组件交互,包括当前组件想执行的动作和组件之间传递数据

显式Intent

🗡需求:启动目标活动

思路:Activity类提供了一个startActivity()方法,用于启动活动。此方法接收一个Intent参数,将构建好的Intent传入startActivity()方法即可。

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

隐式Intent

🗡需求:启动目标活动

思路:大体同显式,但需要在AndroidMainfest文件中配置action和category标签

<action android:name="com.example.activitytest.ACTION_START" />
<category android:name="android.intent.category.DEFAULT" />
    
    
Intent intent = new Intent(com.example.activitytest.ACTION_START)
startActivity(intent);

Intent传递数据

🗡最简单的传递方式

Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
intent.putExtra("键值",数据);//传递
startActivity(intent);

接收

Intent intent = getIntent();
String data = intent.getStringExtra("extra_data");

🗡返回数据给上一个活动

思路:Activity中的startActivityForResult()方法也是用于启动活动的,这个方法期望在活动销毁的时候能够返回一个结果给上一个活动。

[注意]:startActivityForResult()方法接收两个参数,第一个参数还是Intent,第二个参数是请求码,用于在之后的回调中判断数据的来源。

Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
startActivityForResult(intent,1); //请求

返回

Intent intent = new Intent();
intent.putExtra("data_return","hello one");
setResult(RESULT_OK,intent);
finish();

在第一个activity中接收

@Override
protected void onActivityResult(int requestCode,int resultCode,Intent data){
    switch(requestCode){
        case 1:
            if(resultCode == RESULT_OK) {
                String returnedData = data.getStringExtra("data_return");
                Log.d("FirstActivity",returnedData);
            }
            break;
        default:
    }
}

Fragment-动态添加碎片

private void replaceFragment(Fragment fragment){
    FragmentManager fragmentManager = getSupportFragmentMannager();
    FragmentTransaction transaction = fragmentManager.beginTransaction();
    transaction.replace(R.id.right_layout,fragment);
    transaction.addToBackStack(null); //补充:接收一个名字用于描述返回栈的状态(就是点back程序不会退出,而是回到上一个fragment)
    transaction.commit();
}
//总结:
//1.创建待添加碎片,就是new一个fragment
//2.获取FragmentManager,可以直接在activity中getSupportFragmentMannager()调取
//3.开启一个事务,通过调用beginTransaction()方法开启
//4.向容器内添加或替换碎片,一般用replace()方法,其中需要传入容器id和待添加的碎片实例
//5.提交事务,调用commit()

调用Fragment(碎片)里的方法

RightFragment rightFragment = (RightFragment) getFragmentManager().findFragmentById(R.id.right_fragment);
//利用findFragmentById获取碎片实例

从Text中取值

String text = tv.getText().toString();
            //实例化对象.getText().toString();

复杂的ListView

ListView的简单用法

🐰step1:创建一个布局xml文件,忽略。。

🐰step2:编写activity

//定义数据
private String[] data = {"Apple","Banana","Orange"};
//onCreate生命周期
@Override
protectd void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_list_1,data);
    ListView listView = (ListView) findViewById(R.id.list_view);
    ListView.setAdapter(adapter);
}

//adapter适配器   将ListView与数据data关联

定制ListView界面

🐰step3:定义一个实体类

public class Fruit {
    private String name;
    private int imageId;
    
    public Fruit(String name,int imageId) {
        this.name = name;
        this.imageId = imageId;
    }
    
    public String getName() {
        return name;
    }
    public int getImageId() {
        return imaged;
    }
}

🐰step4:自定义一个存放文本和图片的布局文件,fruit_item.xml

🐰step5:编写一个自定义适配器,泛型指定为Fruit类

public class FruitAdapter extends ArrayAdapter<Fruit> {
    private int resourceId;
    public FruitAdapter(Context context,int textViewResourceId,List<Fruit> objects) {
        super(context,textViewResourceId,objects);
        resourceId = textViewResourceId;
    }
    @Override
    public View getView(int position,View convertView,ViewGroup parent){
        Fruit fruit = getItem(position); //获取当前项的Fruit实例
        View view = LayoutInflater.from(getContext()).inflate(resourceId,parent,false);
        ImageView fruitImage = (ImageView)view.findViewById(R.id.fruit_image);
        TextView fruitName = (TextView) view.findViewById(R.id.fruit_name);
        fruitImage.setImageResource(fruit.getImagedId());
        fruitName.setText(fruit.getName());
        return view;
    }
}

🐰step6:修改activity代码

@Override
protectd void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    FruitAdapter<String> adapter = new FruitAdapter<String>(MainActivity.this,android.R.layout.simple_list_1,fruitList);
    ListView listView = (ListView) findViewById(R.id.list_view);
    ListView.setAdapter(adapter);
}

private void initFruits(){
    for(int i=0;i<2;i++){//无意义循环,只是为了增加数据
        Fruit apple = new Fruit("Apple",R.drawable.apple_pic);
        fruitList.add(apple);
        ...//重复添加
    }
}

ps:书上还有ListView代码优化的方法,感兴趣的可以看看

比ListView更强大的控件-----RecyclerView

。。。学习中。。。明天更

使用HttpURLConnection

简单流程:

URL url = new UPL("http://www.baidu.com");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
//设置请求类型
connection.setRequestMethod("GET");  //发送GET请求   GET/POST
//设置请求超时
connection.setConnectTimeout(8000);//时间毫秒值
connection.setReadTimeout(8000);
//获取服务器返回的输入流
InputStream in = connection.getInputStream();
//关闭HTTP
connection.disconnect();
🗡需求:读取返回输入流
reader = new BufferedReader(new InputStreamReader(in));
StringBuilder response = new StringBuilder();
String line;
While((line = reader.readLine()) !==null ){
    response.append(line);
}
showResponse(response.toString());

使用OkHttp(学一般发现没啥用emm)

首先,创建一个OkHttpClient的实例

OkHttpClient client = new OkHttpClient();

接下来如果想要发起一条HTTP请求,就需要创建一个Request对象:

Request request = new Request.Builder().build();

上述代码知识创建了一个空的Request对象,并没有什么实际作用,我们可以在最终的build()方法之前连缀许多其他方法来丰富这个request。

以上是关于Android第一行代码--学习笔记(更新中ing)的主要内容,如果未能解决你的问题,请参考以下文章

Android入门学习笔记(更新中ing)

Android第一行代码学习笔记二---在活动中使用Toast

Android第一行代码学习笔记六---Intent向活动传递数据

Android第一行代码学习笔记---手动创建活动

Android第一行代码学习笔记三---在活动中使用Menu

Android第一行代码学习笔记五---隐式Itent启动其它程序的活动