4.Android组件Activity
初识Activity
关于Activity
可以与用户交互的一个单独的屏幕。
- 例如:计算器、拨号屏幕等。
Activity用来管理需要显示的各种组件。
- 例如,按钮、输入框、文本框等等。
一个应用程序一般由多个Activity构成。
Activity具有生命周期。
创建Activity
创建Activity的方法:
创建一个继承Activity类或Activity派生类的子类
实现回调方法onCreadte(),并调用setContentView(int LayoutResID)方法,加载布局文件。
在AndroidManifest.xml中声明Activity
Activity的派生类
为了方便开发,一般继承AppCompatActivity而不直接继承Activity。
Intent和 IntentFilter 的解析
了解Intent与IntentFilter
什么是Intent
Intent的中文意思是“意向、意图”。Android中提供了Intent机制来协助应用间的交互和应用程序内部的activity, service和broadcast receiver之间的交互。即使用Intent 实现程序的”调用意图”。
Intent包括如下的属性,用于完成执行的意图:
action(动作): 用来表示意图的动作,如:查看,发邮件,打电话
category(类别): 用来表示动作的类别。
data(数据): 表示与动作要操作的数据。如:查看指定的联系人
type(数据类型): 对data类型的描述。
extras(附件信息): 附件信息。如:详细资料,一个文件,某事。
component(目标组件): 目标组件。
什么是IntentFilter
顾名思义,IntentFilter是Intert的过滤器。 Android 操作系统使用过滤器来指定一系列活动、服务和广播接收器处理意图,需要借助于意图所指定的动作、类别、数据模式。
“过滤”大多情况下不在java代码中设置,而是在应用的manifest文件中作为元素的方式声明。在 manifest 文件中使用 元素在活动,服务和广播接收器中列出对应的动作,类别和数据类型。
Activity间的跳转
Intent 调用分为两种:Explicit(显式意图)和 Implicit(隐式意图)
Explicit(显式意图):
显式意图经常用于连接应用程序的内部世界。例如,在一个应用中,需要从一个Activity跳转到另外一个Activity。
Implicit(隐式意图):
隐式意图经常用于激活其他应用程序的组件。例如,启动浏览器打开一个网页,启动拨打电话界面等。
显式Intent跳转Activity
通过名称启动目标组件:
- 实例化Intent对象。其中一个Intent构造方法:Intent(Context Context, Class<?> cls)
- 调用Activity.startActivity(Intent intent) 方法,启动一个Activity.
// 通过指定类名的显式意图 Intent intent=new Intent(MainActivity.this,SecondActivity.class); // 启动目标活动 startActivity(intent);
隐式Intent启动系统默认浏览器:
当无法确定意图目标,即目标组件名称时,使用隐式Intent启动。通常用于启动其他应用的组件。
//准备Intent的data属性数据 Uri uri = Uri.parse("http://www.baidu.com"); //设置Intent的action属性和data属性 Intent intent = new Intent(Intent.ACTION_VIEW, uri); //启动目标意图 startActivity(intent);
隐式Intent启动自定义“浏览器”:
向自定义浏览器的AndroidManiFest.xml文件添加过滤器配置
<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" /><data android:scheme="https" />
</intent-filter>
在MainAcitivity中获取网页地址
//获取Intent对象
Intent intent=getIntent();
//获取intent对象中data属性的字符串数据
String uriStr=intent.getDataString();
直接启动自定义“浏览器”:
1.在自定义浏览器的AndroidManifest.xml中增加过滤器action属性值。
<intent-filter>……<action android:name="com.ncvt.mybrower.start" />……
</intent-filter>
2.通过自定义浏览器设定的action动作:“com.ncvt.mybrower.start”,直接启动自定义浏览器。
//准备Intent的data属性数据
Uri uri = Uri.parse("http://www.baidu.com");
Intent intent = new Intent("com.ncvt.mybrower.start",uri);
startActivity(intent);
Activity的传值
跳转Activity时传递数据
方法一:直接把数据添加到Intent对象
MainActivity启动SecondActivity,传递extra_data
String data="Hi, SecondActivity"; Intent intent=new Intent(MainActivity.this,SecondActivity.class); //向intent对象添加数据 intent.putExtra("extra_data ", data ); startActivity(intent);
在SecondActivity接收extra_data
//获取Intent对象 Intent intent=getIntent(); //获取传递过来的String类型的数据 String data=intent.getStringExtra("extra_data ");
方法二:把数据添加到Bundle(大篮子)对象
当我们需要连续传递数据或者向多个页面传递数据时,如果采用方法一就会特别繁琐,所以就有了方法二。
Bundle类用作携带数据,它类似于Map,用于存放key-value名值对形式的值。
MainActivity向SecondActivity传递bubdle对象
//实例化bundle对象 Bundle bundle = new Bundle(); //向bundle对象添加数据 bundle.putString("name", "张三" ); bundle.putInt("age", 20); Intent intent = new Intent(MainActivity.this,SecondActivity.class); //向intent对象bundle intent.putExtras(bundle); startActivity(intent);
在SecondActivity接收bubdle对象
//获取bundle对象 Bundle bundle = getIntent().getExtras(); //通过key为“name”来获取value即 nameString. String name=bundle.getString("name"); int age=bundle.getInt("age");
得到Activity返回的数据
startActivityForResult(Intent intent, int requestCode);
setResult(int resultCode, Intent data);
onActivityResult(int requestCode, int resultCode, Intent data);
三个方法间的关系:
1. MainActivity通过调用startActivityForResult()跳转到OtherActivity。
// 返回的结果码 public final static int REQUEST_CODE = 1; //创建intent对象 Intent intent=new Intent(this,OtherActivity.class); //启动OtherActivity,并发送请求码 startActivityForResult(intent,REQUEST_CODE);
2. OtherActivity在自己关闭之前,通过setResult()方法返回数据给MainActivity。
EditText editText=findViewById(R.id.editText); //数据是使用Intent返回 Intent intent = new Intent(); //把返回数据存入Intent intent.putExtra("result", editText.getText().toString()); //设置返回数据 this.setResult(0,intent); //关闭当前窗口 this.finish();
3. MainActivity通过复写onActivityResult()方法来取得回传值。
@Overrideprotected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {super.onActivityResult(requestCode, resultCode, data);switch (requestCode) {case REQUEST_CODE:TextView textView = (TextView) findViewById(R.id.textView2);textView.setText(data.getStringExtra("result"));break;default:}}
Activity的生命周期
关于Activity 栈(Task)
Task 就是一个栈 (A task is a stack of activities.) ,这个栈里面存放了很多 Activity ,它遵循着后进先出的原则。 栈有两个动作:进栈(把对象压入到栈当中)和出栈(把栈中的第一个对象从栈里面拿出来)。
关于Activity的生命周期
–Activity在进栈与出栈的过程中,一般意义上有四种状态:
1.当Activity位于栈顶时,此时正好处于屏幕最前方,此时处于运行状态;
2.当Activity失去了焦点但仍然部分可见(如栈顶的Activity是透明的或者栈顶Activity并不是铺满整个手机屏幕),此时处于暂停状态;
3.当Activity被其他Activity完全遮挡,此时此Activity对用户不可见,此时处于停止状态;
4.当Activity由于人为或系统原因(如低内存等)被销毁,此时处于销毁状态。
Activity的7个回调方法:
1.onCreate() :当Activity第一次被创建时调用,完成活动的初始化操作。
2.onStart() :当用户可以看到这个Activity时调用。
3.onResume() :当获得了用户的焦点时,就是用户点击了屏幕。
4.onPause() :当系统准备启动或回复另一个活动时调用。
5.onStop() :当活动完全不可见时调用,当新启动的活动是对话框式的,还处于可见时,该方法不会被调用。
6.onDestroy():活动被销毁时调用 。
7.onRestart():当活动由停止状态变为运行状态时调用。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1jJRmUtt-1627188850086)(https://cdn.jsdelivr.net/gh/llz-github/image/img1/20210119103744.png)]
Activity的状态:
1.运行状态:在前台、获取了焦点、可以交互
2.暂停状态:部分可见,是去了焦点、无法交互
3.停止状态:不可见、内存中保留Activity对象
4.非活动状态:不在以上三种状态中的Activity则处于非活动状态
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Fow6KKye-1627188850091)(https://cdn.jsdelivr.net/gh/llz-github/image/img1/20210119104914.png)]
Activity的3种生存期:
- 完整生命周期:活动在onCreate() 方法和onDestroy()方法之间所经历的,就是完整生命周期。一般情况下,一个活动会在onCreate()方法中完成各种初始化, onDestroy()方法中完成释放资源的操作。
2.前台生命周期:活动在onResume() 方法和onPause()方法之间所经历的就是前台生命周期。在前台生命周期内,活动总是处于运行状态,此时的活动可以与用户进行交互。
3.可视生命周期:活动在 onStart()方法与 onStop()方法之间所经历的,就是可视生命周期。在可视生命周期内,活动对于用户是可见的,但可能无法和用户进行交互。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YcbVEWoL-1627188850096)(https://cdn.jsdelivr.net/gh/llz-github/image/img1/20210119111616.png)]
体验完整生命周期
•启动Activity1后
onCreate()
onStart()
onResume()
•按Back键
onPause()
onStop()
onDestroy()
体验前台生命周期
场景2:启动Activity1后,通过Activity1上的按钮启动Activity2(对话框),Activity1处于休眠,但仍然可见,。在activity声明中添加对话框样式:
android:theme=“@android:style/Theme.AppCompat.Dialog”
体验可视生命周期
场景3:Activity1启动后,启动来电和接听电话界面,将Activity1完全遮挡,然后挂断电话返回Activity1。
Activity的启动模式
关于Activity的种启动模式
在Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作。在Android中Activity的启动模式决定了Activity的启动运行方式。
Activity启动模式设置:
Activity的四种启动模式:
- Standard;
- singleTop;
- singleTask;
- singleInstance
Standard 模式
默认启动模式,每次激活Activity时都会创建Activity,并放入任务栈中
singleTop 模式
如果在任务的栈顶正好存在该Activity的实例, 就重用该实例,否者就会创建新的实例并放入栈顶(即使栈中已经存在该Activity实例,只要不在栈顶,都会创建实例)。
singleTask 模式
如果在栈中已经有该Activity的实例,就重用该实例。重用时,会让该实例回到栈顶,因此在它上面的实例将会被移除栈。如果栈中不存在该实例,将会创建新的实例放入栈中。
singleInstance 模式
在一个新栈中创建Activity实例,并让多个应用共享栈中的唯一这个Activity实例。任何应用再激活该Activity时,都会重用该栈中的实例,其效果相当于多个应用程序共享一个Activity。
在一个新栈中创建该Activity实例,并让多个应用共享改栈中的该Activity实例。一旦该模式的Activity的实例存在于某个栈中,任何应用再激活该Activity时都会重用该栈中的实例,其效果相当于多个应用程序共享一个应用,不管谁激活该Activity都会进入同一个应用中。
小案例:登录模块开发
主界面代码
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@drawable/register_bg"tools:context=".MainActivity"><LinearLayoutandroid:layout_width="0dp"android:layout_height="0dp"android:layout_marginStart="8dp"android:layout_marginTop="8dp"android:layout_marginEnd="8dp"android:layout_marginBottom="8dp"android:orientation="vertical"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"android:padding="10dp"><TextViewandroid:id="@+id/textView"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="Launch Your App"android:textSize="30sp"android:textColor="#fff"android:textStyle="bold"android:gravity="center"/><TextViewandroid:id="@+id/tv_status"android:layout_width="match_parent"android:layout_height="wrap_content"android:text=""android:layout_marginTop="140dp"android:textSize="20sp"android:textColor="#fff"android:textStyle="bold"android:gravity="center"/><TextViewandroid:id="@+id/tv_id"android:layout_width="match_parent"android:layout_height="wrap_content"android:text=""android:layout_marginTop="10dp"android:textSize="17sp"android:textColor="#fff"android:textStyle="bold"android:gravity="center"/><TextViewandroid:id="@+id/tv_email"android:layout_width="match_parent"android:layout_height="wrap_content"android:text=""android:layout_marginTop="10dp"android:textSize="17sp"android:textColor="#fff"android:textStyle="bold"android:gravity="center"/><Buttonandroid:id="@+id/btn_start_register"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="@android:color/holo_blue_bright"android:textStyle="bold"android:layout_marginTop="30sp"android:text="register" /><Buttonandroid:id="@+id/btn_start_signin"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="@android:color/holo_blue_bright"android:textStyle="bold"android:layout_marginTop="10sp"android:text="sign in" /></LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
注册界面代码
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@drawable/register_bg"tools:context=".RegisterActivity"><LinearLayoutandroid:layout_width="0dp"android:layout_height="0dp"android:layout_marginStart="8dp"android:layout_marginTop="8dp"android:layout_marginEnd="8dp"android:layout_marginBottom="8dp"android:orientation="vertical"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"android:padding="10dp"><TextViewandroid:id="@+id/textView"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="REGISTER"android:textSize="30sp"android:textColor="#fff"android:textStyle="bold"android:gravity="center"/><EditTextandroid:id="@+id/et_reg_email"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="30dp"android:ems="10"android:hint="Email"android:maxLines="1"android:inputType="textEmailAddress"android:text="" /><EditTextandroid:id="@+id/et_reg_id"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="20dp"android:ems="10"android:hint="ID"android:maxLines="1"android:inputType="textPersonName"android:text="" /><EditTextandroid:id="@+id/et_reg_password"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="20dp"android:ems="10"android:hint="PassWord"android:maxLines="1"android:inputType="textPassword"android:text="" /><Buttonandroid:id="@+id/btn_reg_submit"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="@android:color/holo_blue_bright"android:textStyle="bold"android:layout_marginTop="30sp"android:text="register" /></LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
登陆界面代码
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@drawable/register_bg"tools:context=".SigninActivity"><LinearLayoutandroid:layout_width="0dp"android:layout_height="0dp"android:layout_marginStart="8dp"android:layout_marginTop="8dp"android:layout_marginEnd="8dp"android:layout_marginBottom="8dp"android:orientation="vertical"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"android:padding="10dp"><TextViewandroid:id="@+id/textView"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="Sign In"android:textSize="30sp"android:textColor="#fff"android:textStyle="bold"android:gravity="center"/><EditTextandroid:id="@+id/et_signin_id"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="20dp"android:ems="10"android:hint="ID"android:maxLines="1"android:inputType="textPersonName"android:text="" /><EditTextandroid:id="@+id/et_signin_password"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="20dp"android:ems="10"android:hint="PassWord"android:maxLines="1"android:inputType="textPassword"android:text="" /><Buttonandroid:id="@+id/btn_signin_submit"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="@android:color/holo_blue_bright"android:textStyle="bold"android:layout_marginTop="30sp"android:text="sign in" /></LinearLayout></androidx.constraintlayout.widget.ConstraintLayout>
主界面
package com.example.timeemail;import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;public class MainActivity extends AppCompatActivity {private static final int REQUEST_REGISTER_CODE=1;private static final int REQUEST_SIGNIN_CODE=0;private TextView tvstatus;private TextView tvemail;private TextView tvid;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);tvstatus = (TextView)findViewById(R.id.tv_status);tvemail = (TextView)findViewById(R.id.tv_email);tvid = (TextView)findViewById(R.id.tv_id);}public void btn_start_signin_onclick(View view) {Intent intent = new Intent(MainActivity.this,SigninActivity.class);startActivityForResult(intent,REQUEST_SIGNIN_CODE);}public void btn_start_register_onclick(View view) {Intent intent = new Intent(MainActivity.this,RegisterActivity.class);startActivityForResult(intent,REQUEST_REGISTER_CODE);}@Overrideprotected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {super.onActivityResult(requestCode, resultCode, data);if(data == null){return;}switch (requestCode){case REQUEST_REGISTER_CODE:tvstatus.setText("注册成功");tvid.setText("ID:"+data.getStringExtra("id"));tvemail.setText("Email:"+data.getStringExtra("email"));break;case REQUEST_SIGNIN_CODE:tvstatus.setText("登录成功");tvid.setText("您好,"+data.getStringExtra("id"));tvemail.setText("");break;}}
}
登陆界面代码
package com.example.timeemail;import androidx.appcompat.app.AppCompatActivity;import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;public class SigninActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_signin);}public void btn_submit_signin_onclick(View view) {EditText etId=findViewById(R.id.et_signin_id);EditText etPassword=findViewById(R.id.et_signin_password);Intent intent=new Intent();intent.putExtra("id",etId.getText().toString());intent.putExtra("password",etPassword.getText().toString());setResult(0,intent);finish();}
}
注册界面代码
package com.example.timeemail;import androidx.appcompat.app.AppCompatActivity;import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;public class RegisterActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_register);}public void btn_submit_register_onclick(View view) {EditText etId=findViewById(R.id.et_reg_id);EditText etEmail=findViewById(R.id.et_reg_email);EditText etPassword=findViewById(R.id.et_reg_password);Intent intent=new Intent();intent.putExtra("id",etId.getText().toString());intent.putExtra("email",etEmail.getText().toString());intent.putExtra("password",etPassword.getText().toString());setResult(0,intent);finish();}
}
xt;
public class RegisterActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_register);
}public void btn_submit_register_onclick(View view) {EditText etId=findViewById(R.id.et_reg_id);EditText etEmail=findViewById(R.id.et_reg_email);EditText etPassword=findViewById(R.id.et_reg_password);Intent intent=new Intent();intent.putExtra("id",etId.getText().toString());intent.putExtra("email",etEmail.getText().toString());intent.putExtra("password",etPassword.getText().toString());setResult(0,intent);finish();
}
}
4.Android组件Activity相关推荐
- android 组件(activity,service,content provider,broadcast receiver,intent)详解
Android应用程序由若干个不同类型的组件组合而成,每一个组件具有其特定的安全保护设计方式,它们的安全直接影响到应用程序的安全.Android应用程序组件的主要类型有:活动(Activity),服务 ...
- activity启动模式 android,专题:详解Android组件Activity的启动模式singleTask_51CTO.COM
在Android应用程序中,可以配置Activity以四种方式来启动,其中最令人迷惑的就是"singleTask"这种方式了,官方文档称以这种方式启动的Activity总是属于一个 ...
- android组件浮动在activity上_Jetpack Hilt 依赖注入框架上手指南
code小生 一个专注大前端领域的技术平台公众号回复Android加入安卓技术群 作者:LvKang-insist 链接:https://juejin.im/post/5efdff9d6fb9a07e ...
- 详解 Android 的 Activity 组件
本文详细介绍了 Android 应用编程中 Activity 的生命周期.通信方式和 Intent Filter 等内容,并提供了一些日常开发中经常用到的关于 Activity 的技巧和方法.通过本文 ...
- Android 组件系列-----Activity初步
在上篇博文讲解了Android的Activity这个组件的启动流程后,接下来我们就来看看我们的Activity与我们的布局文件的关系吧 我们先来看看一个最简单的布局文件的内容: <Relativ ...
- android的四大组件及使用场景,Android/四大组件/Activity.md · BoraxZYF/AndroidInterview - Gitee.com...
## 四大组件 ## Activity ### Activity 的四种启动模式及使用场景 - standard 标准模式,Activity 的默认启动模式.每次启动一个 Activity 时都会创建 ...
- Android 四大组件(Activity、Service、BroadCastReceiver、ContentProvider)
Android四大基本组件分别是Activity,Service服务,Content Provider内容提供者,BroadcastReceiver广播接收器. 一.了解四大基本组件 Activity ...
- Android四大组件 - Activity知识点总结
Activity Activity是一个应用组件,用户可与其提供的屏幕进行交互,以执行拨打电话.拍摄照片.发送电子邮件或查看地图等操作. 每个 Activity 都会获得一个用于绘制其用户界面的窗口. ...
- Android 组件系列-----Activity生命周期
本篇随笔将会深入学习Activity,包括如何定义多个Activity,并设置为默认的Activity.如何从一个Activity跳转到另一个Activity,还有就是详细分析Activity的生命周 ...
最新文章
- 创建订单 - 扣除商品库存与订单状态保存
- lodop指定打印机打印_GitHub - xtjatswc/formext: 基于Lodop封装的打印框架,支持表单、报表配置。...
- HoudahSpot查找多个文件教程:从名称列表中查找文件
- java设置随机数教程
- SPSS多重响应分析(多选题)【SPSS 016期】
- mt4 谐波_MT4指标AB=CD Dashboard — AB = CD 谐波模式仪表盘指示器
- wineskin下plsql解决中文乱码问题
- Win10 启动项找不到ctfmon项,系统启动后无法输入文字怎么办?
- CVPR 2021 论文大盘点-超分辨率篇
- Greedy Method
- [ 认知心理学 ] 帮我家呆瓜整理的《认知心理学》资料,麻了 --- 考研复习 --- 期末复习
- 网址或者app被入侵了怎么办?
- 汽车云智能采集服务 八爪鱼采集器在汽车行业网站的应用
- 互联网大公司与创业公司
- pyspark:ML和MLlib
- python数据挖掘课程 十.Pandas、Matplotlib、PCA绘图实用代码补充
- 率先断供华为,Google现在后悔了
- 深层揭露百度缘何被黑
- 解忧杂货店(博客系统)的项目测试——黑盒测试
- Sublime Text 4 4126 可用