没事多喝水

技术笔记&记录生活点滴

  • 首页
  • 读书
  • 观影
  • 笔记
  • 读书笔记
  • Android学习
  • 生活
  • 吹口琴
  • 爱咖啡
  • IT技术-文档
  • 日常桌面
  • 数据库
  • CI/CD运维
  • Android开发
  • 小程序&微网页
  • Web开发
  • 产品
  • 教学
  • 安卓
  • 关于
  • 标签
  • 搜索

好多年前的所谓技能书

发表于 2022-02-21 | 更新于 2022-02-23 | 分类于 IT技术/Web开发/

回头看些许唏嘘,还有好多都有遗漏。

upload successful

AndroidMainfest.xml的默认配置说明

发表于 2022-02-20 | 更新于 2022-02-21 | 分类于 笔记/安卓/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.ActivityTest" >

// 单个活动配置
<activity android:name=".FirstActivity">

// 消息传递器,设置入口活动是那个 android.intent.action.MAIN
// 启动应用在程序栏中的图标 android.intent.category.LAUNCHER
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
// 当前activity支持隐式intent传递
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
<activity android:name=".SecondActivity"></activity>
</application>

Activity生命周期

发表于 2022-02-19 | 分类于 笔记/安卓/

活动的生存期

Activity类中定义了7个回调方法

  • onCreate() 。会在活动第一次被创建的时候调用。在这个方法中完成活动的初始化操作,比如说加载布局、绑定事件等。

  • onStart() 。在活动由不可见变为可见的时候调用。

  • onResume() 。在活动准备好和用户进行交互的时候调用。此时的活动一定位于返回栈的栈顶,并且处于运行状态。

  • onPause() 。在系统准备去启动或者恢复另一个活动的时候调用。通常会在这个方法中将一些消耗CPU的资源释放掉,以及保存一些关键数据,但这个方法的执行速度一定要快,不然会影响到新的栈顶活动的使用。

  • onStop() 。在活动完全不可见的时候调用。它和onPause() 方法的主要区别在于,如果启动的新活动是一个对话框式的活动,那么onPause() 方法会得到执行,而onStop() 方法并不会执行。

  • onDestroy() 。在活动被销毁之前调用,之后活动的状态将变为销毁状态。

  • onRestart() 。这个方法在活动由停止状态变为运行状态之前调用,也就是活动被重新启动了。

除了onRestart() 方法,其他都是两两相对的,从而又可以将活动分为3种生存期

完整生存期

活动在onCreate() 方法和onDestroy() 方法之间所经历的,就是完整生存期。一般情况下,一个活动会在onCreate() 方法中完成各种初始化操作,而在onDestroy() 方法中完成释放内存的操作。

可见生存期

活动在onStart() 方法和onStop() 方法之间所经历的,就是可见生存期。在可见生存期内,活动对于用户总是可见的,即便有可能无法和用户进行交互。我们可以通过这两个方法,合理地管理那些对用户可见的资源。比如在onStart() 方法中对资源进行加载,而在onStop() 方法中对资源进行释放,从而保证处于停止状态的活动不会占用过多内存。

前台生存期

活动在onResume() 方法和onPause() 方法之间所经历的就是前台生存期。在前台生存期内,活动总是处于运行状态的,此时的活动是可以和用户进行交互的,我们平时看到和接触最多的也就是这个状态下的活动。

upload successful

upload successful

'activity supporting action_view is not set as browsable'的解决方法

发表于 2022-02-19 | 分类于 笔记/安卓/
1
2
3
4
5
6
7
<activity android:name=".ThirdActivity">
<intent-filter>
  <action android:name="android.intent.action.VIEW"/>
  <category android:name="android.intent.category.DEFAULT"/>
  <data android:scheme="http"/>
</intent-filter>
</activity>

让自己的activity可以响应http的action。但是这样编译不通过,显示:

1
activity supporting action_view is not set as browsable

要把这个activity设为brosable,那就多加一个category

1
2
3
4
5
6
7
8
<activity android:name=".ThirdActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data android:scheme="http"/>
</intent-filter>
</activity>

创建空Activity

发表于 2022-02-18 | 分类于 笔记/安卓/

修改默认build.gradle

build.gradle 外部依赖

引入阿里云maven

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
buildscript {
repositories {
// 阿里云maven

maven{ url 'https://maven.aliyun.com/repository/public'}
maven { url 'https://maven.aliyun.com/repository/jcenter' }
maven { url 'https://maven.aliyun.com/repository/google'}
maven { url 'https://maven.aliyun.com/repository/gradle-plugin'}
google()
mavenCentral()
}
dependencies {
classpath "com.android.tools.build:gradle:4.2.2"

// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}

allprojects {
repositories {

// 阿里云maven

maven{ url 'https://maven.aliyun.com/repository/public'}
maven { url 'https://maven.aliyun.com/repository/jcenter' }
maven { url 'https://maven.aliyun.com/repository/google'}
maven { url 'https://maven.aliyun.com/repository/gradle-plugin'}
google()
mavenCentral()
jcenter() // Warning: this repository is going to shut down soon
}
}

task clean(type: Delete) {
delete rootProject.buildDir
}

app/build.gradle

最小sdk用16,小于16则需要手动建立程序代码与布局,并手动建立代码与布局之间的关系

1
2
3
4
5
6
7
8
9
defaultConfig {
applicationId "com.example.activitytest"
minSdkVersion 15
targetSdkVersion 29
versionCode 1
versionName "1.0"

testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}

建好后,重新编译,并sync代码

upload successful

upload successful

创建布局

建立布局目录

app/src/main/res,右键建立布局目录,目录名称layout

upload successful

建立布局文件

app/src/main/res/layout,右键建立布局文件

upload successful

创建Activity代码

点击app/src/main/java/程序目录

右键新增,EmptyActivity,输入活动名称

upload successful

sdk小于16,需要点击Gallery,选择。否则点击Empty Ativity。

如果是系统建立的活动名称,各种包以及引入,SDK<16的情况,则需要的手工引入

引入的包

1
2
3
4
5
6
7
8
9
import android.os.Bundle;
import android.content.Intent;
import android.net.Uri;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

默认构造类,需要继承AppCompatActivity类

1
2
3
4
5
6
7
public class FirstActivity extends AppCompatActivity {
// 创建默认的活动,并在活动关闭后保存状态
super.onCreate(savedInstanceState);

// 设置默认布局图
setContentView(R.layout.first_layout);
}
修改配置文件

编辑AndroidManifest.xml

增加活动,增加Intent信息传递,设置该活动为主活动,并为默认活动

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.ActivityTest" >

<activity android:name=".FirstActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

重新构建项目,运行APP

intent消息传递

发表于 2022-02-17 | 更新于 2022-02-19 | 分类于 笔记/安卓/

作用

给各个服务传递消息

分类2类

Intent(Context packageContext, Class)

这个构造函数接收两个参数,第一个参数Context 要求提供一个启动活动的上下文,第二个参数Class 则是指定想要启动的目标活动,通过这个构造函数就可以构建出Intent 的“意图”。

类似传递工具,将当前启动活动,目标下一个启动活动,作为构造函数的参数,生成一个intent对象。
通过startActivity方法启动这个链接器,启动目标活动。

Activity类中提供了一个startActivity() 方法,这个方法是专门用于启动活动的,它接收一个Intent 参数

显式传递
1
2
3
4
5
6
7
8
9
10
11
12
Button button2 = findViewById(R.id.button_2);
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
// 显式 Intent
// 指定传递目标
Intent intent = new Intent(MainActivity.this,SecondActivity.class);


startActivity(intent);
}
隐式传递
1
2
3
4
5
6
7
8
9
10
11
12
13
Button button2 = findViewById(R.id.button_2);
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {

// 隐式传递
// 依据AndroidMainifest.xml中定义的条件所筛选
// 指定action包含ACTION_START
// 添加指定category 有自定义MY_CATEGORY
Intent intent = new Intent("com.example.helloworld.ACTION_START");
intent.addCategory("com.example.helloworld.MY_CATEGORY");
startActivity(intent);
}
调用组件传递

通过view和dial等不同组件,传递不同功能的数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Button button2 = findViewById(R.id.button_2);
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {

// 传递用view方式,调用的形式是网页
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.baidu.com"));


// 专递多的是电话,调用号码
Intent intent = new Intent(Intent.ACTION_DIAL);
intent.setData(Uri.parse("tel:10086"));


startActivity(intent);
}

指定了Intent的action 是Intent.ACTION_VIEW ,这是一个Android系统内置的动作,其常量值为android.intent.action.VIEW 。然后通过Uri.parse() 方法,将一个网址字符串解析成一个Uri 对象,再调用Intent的setData() 方法将这个Uri 对象传递进去。

传递数值

Activity之间正向传输数据

递送端

1
2
3
4
5
6
7
8
9
10
11
//设定传送数值
String data = "传递数值1";

//新建消息传递,设定当前与目标
Intent intent = new Intent(MainActivity.this,ThirdActivity.class);

//设定传递信息,key value方式
intent.putExtra("extra_data",data);

//设定请求识别代码
startActivity(intent);

接受端

1
2
3
4
5
6
7
8
//新建传送,根据传送端设定的key获取值,通过提示框显示
Intent intent = getIntent();
String data = intent.getStringExtra("extra_data");
Toast.makeText(
ThirdActivity.this,
data ,
Toast.LENGTH_SHORT
).show();
Activity之间反向传输数据

从接受端传输给发送端并销毁自身

  • 发送端
1
2
3
4
5
6
7
//startActivityForResult() 方法接收两个参数,第一个参数还是Intent,第二个参数是请求码,用于在之后的回调中判断数据的来源

//如参数2 > = 0,当Activity结束时requestCode将归还在onActivityResult()中。确定返回的数据是从哪个Activity中返回,用来标识目标Activity。

//建立一个互动传递,并设定标识Activity值
Intent intent = new Intent(MainActivity.this,ThirdActivity.class);
startActivityForResult(intent,1);
  • 接受端
1
2
3
4
5
6
7
8
9
// 建立专递,设定活动传递,并设定改活动要传递的值,设定活动要传递的位置是前一个Activity,并且这个Activity专递过来是状态OK,同时将这个值也设定,并送出。
// 销毁自身

// setResult() 方法接收两个参数,第一个参数用于向上一个活动返回处理结果,一般只使用RESULT_OK 或RESULT_CANCELED 这两个值,第二个参数则把带有数据的Intent传递回去

Intent intent = new Intent();
intent.putExtra("data_return","这是返回的值");
setResult(RESULT_OK,intent);
finish();
  • 发送端
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// 重写Activity的获取状态方法,判断requestCode,判断是否为启动时传出的设定值
// 判断处理是否成功,都符合后显示


// onActivityResult() 方法带有三个参数,第一个参数requestCode ,即我们在启动活动时传入的请求码。第二个参数resultCode ,即我们在返回数据时传入的处理结果。第三个参数data ,即携带着返回数据的Intent。

@Override
protected void onActivityResult(int requestCode,int resultCode,Intent data) {
switch (requestCode) {
case 1:
if(resultCode == RESULT_OK){
String returnedData = data.getStringExtra("data_return");
Toast.makeText(
MainActivity.this,
returnedData,
Toast.LENGTH_SHORT
).show();
}
break;
default:
}
}

测试笔记

发表于 2022-02-17 | 分类于 笔记

Android 黄色报错 App is not indexable by Google Search

发表于 2022-02-17 | 分类于 IT技术/安卓/

在activiy中增加

1
<action android:name="android.intent.action.VIEW" />

upload successful

在app的build.gradle的android{ }中添加代码:

1
2
3
lintOptions {
disable 'GoogleAppIndexingWarning'
}

upload successful

Android Studio里Gradle Sync 国内镜像

发表于 2022-02-07 | 更新于 2022-02-17 | 分类于 IT技术/安卓/

项目配置文件build.gradle,添加阿里云Gradle镜像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/ Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
repositories {
// 四行添加阿里云的仓库地址,加速插件下载速度
maven { url 'https://maven.aliyun.com/repository/jcenter' }
maven { url 'https://maven.aliyun.com/repository/google'}
maven { url 'https://maven.aliyun.com/repository/gradle-plugin'}
maven { url 'https://maven.aliyun.com/repository/public'}
google()
jcenter()
}
dependencies {
// 配置gradle插件版本,下面的版本号就是Android Studio的版本号
classpath 'com.android.tools.build:gradle:4.1.1'
}
}

allprojects {
repositories {
// 四行添加阿里云的仓库地址,加速插件下载速度
maven { url 'https://maven.aliyun.com/repository/jcenter' }
maven { url 'https://maven.aliyun.com/repository/google'}
maven { url 'https://maven.aliyun.com/repository/gradle-plugin'}
maven { url 'https://maven.aliyun.com/repository/public'}
google()
jcenter()

}
}

task clean(type: Delete) {
delete rootProject.buildDir
}

Android Studio 配置

发表于 2022-02-07 | 更新于 2022-02-17 | 分类于 IT技术/安卓/

加速下载更新

默认下载从 谷歌官网下载,速度很慢,可以通过添加代理的方式加速更新

代理网址: http://mirrors.neusoft.edu.cn/

链接

具体步骤
  • 设置自动更新代理

upload successful

  • 设置强制更新

upload successful

SDK位置修改

Android 开发可基于不同的SDK版本进行调试,随着不同版本的SDK的安装的增多,导致磁盘容量占用持续增大,原本的默认安装位置无法满足磁盘。此时将SDK安装目录移动至合适的位置。

upload successful

模拟器磁盘不足
1
2
3
4
5
cd ~/.android/avd
cp -R Nexus_5X_API_24.avd /Volumes/5K17/Android/avd/Nexus_5X_API_24.avd

# 修改 Nexus_5X_API_24.ini
path=/Volumes/5K17/Android/avd/Nexus_5X_API_24.avd
<i class="fa fa-angle-left" aria-label="上一页"></i>1234…13<i class="fa fa-angle-right" aria-label="下一页"></i>
Space Yuan

Space Yuan

126 日志
26 分类
72 标签
RSS
<i class="fa fa-fw fa-github"></i>GitHub <i class="fa fa-fw fa-envelope"></i>E-Mail
© 2018 – 2022 Space Yuan