Android 活动Activity

news2024/11/23 22:53:21

目录

  • 一、启停活动页面
    • 1.1 Activity的启动和结束
    • 1.2 Activity的生命周期
    • 1.3 Activity的启动模式
  • 二、在活动之间传递消息
    • 2.1 显式Intent和隐式Intent
    • 2.2 向下一个Activity发送数据
    • 2.3 向上一个Activity返回数据
  • 三、补充附加信息
    • 3.1 利用资源文件配置字符串
    • 3.2 利用元数据传递配置信息
    • 3.3 给应用页面注册快捷方式

一、启停活动页面

1.1 Activity的启动和结束

1.启动

当activity启动时就会触发onCreate()方法,里面一般执行一些初始化操作,可以通过startActivity()方法跳转页面

代码示例:
xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center"
    >
    <Button
        android:id="@+id/btn_act_next"
        android:layout_width="300dp"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="点击进入下一页"
        />
</LinearLayout>

java代码:

public class ActStartActivity extends AppCompatActivity implements View.OnClickListener{
    private static final String TAG = "ning";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG,"ActStartActivity onCreate");
        setContentView(R.layout.activity_act_start);
        findViewById(R.id.btn_act_next).setOnClickListener(this);
    }
    public void onClick(View v) {
        //设置意图:第一种方式
        //Intent intent = new Intent(this, ActFinishActivity.class);
        //第二种方式;调用意图对象的setClass方法指定
        Intent intent = new Intent();
        //intent.setClass(this,ActFinishActivity.class);
        //第三种方式:调用意图对象的setComponent.方法指定
        ComponentName component = new ComponentName(this,ActFinishActivity.class);
        intent.setComponent(component);
        //跳转页面
        startActivity(intent);
    }
}

2.结束
通过finish()结束当前页面
代码示例:

public class ActFinishActivity extends AppCompatActivity implements View.OnClickListener{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_act_finish);
        findViewById(R.id.tv_back).setOnClickListener(this);
        findViewById(R.id.btn_back).setOnClickListener(this);
    }
    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.tv_back || v.getId() == R.id.btn_back){
            finish();
        }
    }
}

1.2 Activity的生命周期

  • onCreate:创建活动。此时会把页面布局加载进内存,进入了初始状态。
  • onStart:开启活动。此时会把活动页面显示在屏幕上,进入了就绪状态。
  • onResume:恢复活动。此时活动页面进入活跃状态,能够与用户正常交互,例如允许响应用户的点击动作、允许用户输入文字等。
  • onPause:暂停活动。此时活动页面进入暂停状态(也就是退回就绪状态),无法与用户正常交
    互。
  • onStop:停止活动。此时活动页面将不在屏幕上显示。
  • onDestroy:销毁活动。此时回收活动占用的系统资源,把页面从内存中清除掉。
  • onRestart:重启活动。处于停止状态的活动,若想重新开启的话,无须经历onCreate的重复创建
    过程,而是走onRestart的重启过程。
  • onNewIntent:重用已有的活动实例。
    在这里插入图片描述
    代码示例:
public class ActStartActivity extends AppCompatActivity implements View.OnClickListener{
    private static final String TAG = "ning";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG,"ActStartActivity onCreate");
    }
    @Override
    protected void onStart() {
        super.onStart();
        Log.d(TAG,"ActStartActivity onStart");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.d(TAG,"ActStartActivity onResume");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.d(TAG,"ActStartActivity onPause");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.d(TAG,"ActStartActivity onStop");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d(TAG,"ActStartActivity onDestroy");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.d(TAG,"ActStartActivity onRestart");
    }
}

1.3 Activity的启动模式

系统给每个app分配内存栈,栈里面装着已创建并且为销毁的活动信息,栈的结构是先进后出,比如A活动跳到B活动,在按返回键就回返回到A页面,而不是返回到桌面,这是默认的启动模式。
在这里插入图片描述
可以通过两种方式改变app的启动模式:

  1. 修改AndroidManifest.xml,在指定的activity节点添加属性android:launchMode,表示本活动以哪个启动模式运行,standard为标准模式(静态设置)

            <activity
                android:name=".LoginInputActivity"
                android:launchMode="standard"
                android:exported="true">
            </activity>
    

    launchMode取值如下:

    模式含义
    standard默认启动模式,依照启动顺序被依次压入
    singleInstance全局唯一模式,为目标 Activity 创建一个新的 Task 栈,将目标 Activity 放入新的 Task,并让目标Activity获得焦点。
    singleInstancePerTask如果不存在包含目标Activity的栈,则创建一个新的Task,这个Task中是目标Activity所独有的,并且只会创建一次,后续如果在启动其它的Activity,这些新的Acitivty仍然当前的task栈。
    singleTask栈内复用模式,task 栈内存在目标 Activity 实例,则将 task 内的对应 Activity 实例之上的所有 Activity 弹出栈,并将对应 Activity 置于栈顶,获得焦点
    singleTop栈顶复用模式,如果栈顶 Activity 为我们要新建的 Activity(目标Activity),那么就不会重复创建新的Activity。
  2. 调用Intent的setFlags方法,表示后续启动的活动采用该启动标志 (动态设置)

            //栈中存在待跳转的活动实例时,则重新创建该活动的实例,并清除原实例上方的所有实例
            intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            //开辟一个新的任务栈,如果原来不存在活动栈,则会创建一个新栈
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            //当栈顶为待跳转的活动实例时,则会重用栈顶的实例
            intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
            //与standard 类似,但栈中不保存新启动的活动实例
            intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
            //跳转到新页面时,栈中的原有实例都被清除,该标志需要结合FLAG_ACTIVITY_NEW_TASK使用,即:
            // intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | FLAG_ACTIVITY_NEW_TASK);
            intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
    

二、在活动之间传递消息

2.1 显式Intent和隐式Intent

  1. 显示Intent,直接指明来源活动与目标活动,属于精准匹配

    第一种方式
    Intent intent = new Intent(this, ActNextActivity.class); // 创建一个目标确定的意图
    第二种方式
    Intent intent = new Intent(); // 创建一个新意图
    intent.setClass(this, ActNextActivity.class); // 设置意图要跳转的目标活动
    第三种方式
    Intent intent = new Intent(); // 创建一个新意图
    // 创建包含目标活动在内的组件名称对象
    ComponentName component = new ComponentName(this, ActNextActivity.class);
    intent.setComponent(component); // 设置意图携带的组件信息

  2. 隐式Intent,没用明确要跳转的目标,只给出一个动作字符串让系统自动匹配,属于模糊匹配
    在这里插入图片描述下面是一个调用系统拨号程序的代码例子,其中就用到了Uri:
    String phoneNo = "12345";
    Intent intent = new Intent(); // 创建一个新意图
    intent.setAction(Intent.ACTION_DIAL); // 设置意图动作为准备拨号
    Uri uri = Uri.parse("tel:" + phoneNo); // 声明一个拨号的Uri
    intent.setData(uri); // 设置意图前往的路径
    startActivity(intent); // 启动意图通往的活动页面
    

隐式Intent还用到了过滤器的概念,把不符合匹配条件的过滤掉,剩下符合条件的按照优先顺序调用。
例如AndroidManifest.xml里面的首页活动:

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

Intent组成元素的列表说明:

元素名称设置方法说明
ComponentsetComponent组件,它指定意图的来源与目标
ActionsetAction动作,它指定意图的动作行为
DatasetData即Uri,它指定动作要操纵的数据路径
CategoryaddCategory类别,它指定意图的操作类别
TypesetType数据类型,它指定消息的数据类型
ExtrasputExtras扩展信息,它指定装载的包裹信息
FlagssetFlags标志位,它指定活动的启动标志

2.2 向下一个Activity发送数据

在这里插入图片描述

第一步创建Bundle消息包裹,用来存放数据

Bundle bundle = new Bundle();
bundle.putString("time", DateUtil.getNowTime());
bundle.putString("text",textView.getText().toString());

第二步 把快递包裹塞给意图

intent.putExtras(bundle);
//跳转页面
startActivity(intent);

另一个页面获取消息

//获取消息
Bundle bundle = getIntent().getExtras();
String time = bundle.getString("request_time");
String text = bundle.getString("request_text");

2.3 向上一个Activity返回数据

第一步:上一个页面打包好请求数据,调用startActivityForResult方法执行跳转动作,表示需要处理下
一个页面的应答数据,该方法的第二个参数表示请求代码,它用于标识每个跳转的唯一性。

       ActivityResultLauncher<Intent> register = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() {
            //从另一个页面返回来数据时执行
            public void onActivityResult(ActivityResult result) {
                if (result!=null){
                    Intent intent = result.getData();
                    if(intent != null && result.getResultCode() == Activity.RESULT_OK){
                        //获取消息
                        Bundle bundle = intent.getExtras();
                        System.out.println(bundle);
                        String time = bundle.getString("response_time");
                        String text = bundle.getString("response_text");
                        String s = String.format("收到返回消息,请求时间:%s,请求内容:%s",time,text);
                        tv_response.setText(s);
                    }
                }
            }
        });
        Intent intent = new Intent(this,ActResponseActivity.class);
        //创建包裹
        Bundle bundle = new Bundle();
        bundle.putString("request_time", DateUtil.getNowTime());
        bundle.putString("request_text",mRequest);
        intent.putExtras(bundle);
        register.launch(intent);

第二步:下一个页面接收并解析请求数据,进行相应处理。

		//获取消息
        Bundle bundle = getIntent().getExtras();
        String time = bundle.getString("request_time");
        String text = bundle.getString("request_text");
        String s = String.format("收到请求消息:请求时间:%s,请求内容:%s",time,text);
        tv_request.setText(s);

第三步:调用setResult方法返回数据,第一个参数代表应答代码,第二个参数为意图对象

Intent intent = new Intent();
Bundle bundle = new Bundle();
bundle.putString("response_time", DateUtil.getNowTime());
bundle.putString("response_text",mResponse);
intent.putExtras(bundle);
//携带意图返回上一个页面
setResult(Activity.RESULT_OK,intent);
//结束当前页面
finish();

三、补充附加信息

3.1 利用资源文件配置字符串

在res/values/strings.xml文件中配置

<resources>
    <string name="app_name">MyApplication_03_Activity</string>
    <string name="weather">天气热死</string>
    <string name="first_short">first</string>
    <string name="first_long">start_activity</string>
    <string name="second_short">second</string>
    <string name="second_long">Jump_second</string>
    <string name="three_short">three</string>
    <string name="three_long">login_back</string>
</resources>

通过java代码读取

String value = getString(R.string.weather_str);

3.2 利用元数据传递配置信息

不希望其他活动也能获取该参数,就可以设置元数据。
AndroidManifest.xml,在测试活动的activity节点内部添加meta-data标签,通过属性name指定元数据
的名称,通过属性value指定元数据的值。

        <activity
            android:name=".ActStartActivity"
            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="weather" android:value="晴天" />
        </activity>

配置好了activity节点的meta-data标签,再回到Java代码获取元数据信息,获取步骤分为下列3步:

  • 调用getPackageManager方法获得当前应用的包管理器。
  • 调用包管理器的getActivityInfo方法获得当前活动的信息对象。
  • 活动信息对象的metaData是Bundle包裹类型,调用包裹对象的getString即可获得指定名称的参数值
public class MetaDataActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_meta_data);
        TextView tv_meta = findViewById(R.id.tv_meta);
        //获取应用包管理器
        PackageManager pm = getPackageManager();
        try {
            //从应用包管理器中获取当前的活动信息
            ActivityInfo info = pm.getActivityInfo(getComponentName(), PackageManager.GET_META_DATA);
            //获取活动附加的元数据信息
            Bundle bundle = info.metaData;
            String s = bundle.getString("weather");
            tv_meta.setText(s);
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
    }
}

3.3 给应用页面注册快捷方式

元数据不单单能传递简单的字符串参数,还能传送更复杂的资源数据
第一步:在res中创建xml包,里面创建shortcuts.xml文件
第二步:配置strings.xml,一共三对,每一对有个长名称和短名称,当长名称显示不下就会显示短名称

<resources>
    <string name="app_name">MyApplication_03_Activity</string>
    <string name="first_short">first</string>
    <string name="first_long">start_activity</string>
    <string name="second_short">second</string>
    <string name="second_long">Jump_second</string>
    <string name="three_short">three</string>
    <string name="three_long">login_back</string>
</resources>

第三步:配置shortcuts.xml文件

<?xml version="1.0" encoding="utf-8"?>
<shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
    <shortcut
        android:shortcutId="first"
        android:enabled="true"
        android:icon="@mipmap/ic_launcher"
        android:shortcutShortLabel="@string/first_short"
        android:shortcutLongLabel="@string/first_long"
        >
        <intent
            android:action="android.intent.action.VIEW"
            android:targetPackage="com.example"
            android:targetClass="com.example.ActStartActivity"
            />
        <categories android:name="android.shortcut.conversation"/>
    </shortcut>
    <shortcut
        android:shortcutId="first"
        android:enabled="true"
        android:icon="@mipmap/ic_launcher"
        android:shortcutShortLabel="@string/second_short"
        android:shortcutLongLabel="@string/second_long"
        >
        <intent
            android:action="android.intent.action.VIEW"
            android:targetPackage="com.example"
            android:targetClass="com.example.JumpFirstActivity"
            />
        <categories android:name="android.shortcut.conversation"/>
    </shortcut>
    <shortcut
        android:shortcutId="first"
        android:enabled="true"
        android:icon="@mipmap/ic_launcher"
        android:shortcutShortLabel="@string/three_short"
        android:shortcutLongLabel="@string/three_long"
        >
        <intent
            android:action="android.intent.action.VIEW"
            android:targetPackage="com.example"
            android:targetClass="com.example.LoginInputActivity"
            />
        <categories android:name="android.shortcut.conversation"/>
    </shortcut>
</shortcuts>

每个shortcut节点都代表了一个菜单项,该节点的各属性说明如下:

  • shortcutId:快捷方式的编号。
  • enabled:是否启用快捷方式。true表示启用,false表示禁用。
  • icon:快捷菜单左侧的图标。
  • shortcutShortLabel:快捷菜单的短标签。
  • shortcutLongLabel:快捷菜单的长标签。优先展示长标签的文本,长标签放不下时才展示短标签
    的文本。

第四步:配置AndroidManifest.xml

<activity android:name=".MainActivity">
	<intent-filter>
		<action android:name="android.intent.action.MAIN" />
		<category android:name="android.intent.category.LAUNCHER" />
	</intent-filter>
	<!-- 指定快捷方式。在桌面上长按应用图标,就会弹出@xml/shortcuts所描述的快捷菜单 -->
	<meta-data
		android:name="android.app.shortcuts"
		android:resource="@xml/shortcuts" />
</activity>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1057392.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

操作系统--分页存储管理

一、概念介绍 分页存储&#xff1a;一是分内存地址&#xff0c;二是分逻辑地址。 1.分内存地址 将内存空间分为一个个大小相等的分区。比如&#xff0c;每个分区4KB。 每个分区就是一个“页框”&#xff0c;每个页框有个编号&#xff0c;即“页框号”&#xff0c;“页框号”…

Linux【网络】数据链路层

Linux【网络】数据链路层 数据链路层以太网帧格式对比理解MAC地址和IP地址ARP协议--地址解析协议ARP工作流程ARP请求ARP应答 其他协议DNS-域名解析协议ICMP--网络层协议NAT技术NAPT 正向代理与反向代理 数据链路层 数据链路层用于两个设备&#xff0c;同一数据链路节点之间的信…

DPDK程序结合网络助手接收数据

网络调试工具&#xff1a;https://download.csdn.net/download/hdsHDS6/88390999?spm1001.2014.3001.5503 DPDK代码&#xff1a; #include <stdio.h> #include <string.h> #include <rte_eal.h> #include <rte_ethdev.h> #include <rte_ip.h> …

[管理与领导-112]:IT人看清职场中的隐性规则 - 9 - 付出与回报的关系:先付出,后回报,不行就止损,这才是职场价值交换的本质

目录 一、职场中付出与回报的先后关系 二、付出与回报四象限模型 三、职场专业性的本质 一、职场中付出与回报的先后关系 在职场中&#xff0c;个人的付出和回报之间存在着先后关系。以下是按照先后关系划分的四种类型&#xff1a; 先付出后回报型&#xff0c;不回报&#…

对进程的初步认识以及fork()函数的理解

什么是进程 进程是什么呢&#xff1f;其实解释的通俗浅显一点就是我们运行到内存的程序。我们知道运行一个磁盘里的程序时&#xff0c;会将该程序先加载&#xff08;将磁盘的数据拷贝&#xff09;到内存当中&#xff0c;因此该程序就可以称为一个进程。首先我们以Windows操作…

特斯拉被称为自动驾驶领域的苹果

特斯拉的自动驾驶技术无疑是居于世界上领先地位的,有人形容特斯拉是自动驾驶汽车领域的苹果。特斯拉发布的Tesla Vision系统只配备了摄像头,不依靠雷达。 这并不是特斯拉唯一和其它对手不同的地方,他们的整个战略都是基于车队和销售产品,而其大多数竞争对手则销售自…

ENVI报错:SaveRasterFile failed:IDLnaMetadata Error

ENVI报错&#xff1a;SaveRasterFile failed:IDLnaMetadata Error 问题描述 ENVI在另存为为TIFF文件时&#xff0c;报了下面这个错误信息 原因 输出路径或者是存放影像的路径里面包含中文&#xff0c;不能包含中文 解决方案 把所有相关路径中的中文改成英文

【第十四届蓝桥杯单片机组】学习笔记(5):PCF8591( AD/DA芯片)

目录 概述功能字芯片寻址控制字A/D转换单通道读取多通道读取 概述 芯片通信方式&#xff1a;IICAIN0&#xff0c;AIN1&#xff0c;AIN2&#xff0c;AIN3&#xff1a;(Analog signal In) 模拟信号输入AOUT&#xff1a;模拟信号输出 功能字 芯片寻址 这是在比赛提供的PCF8591芯…

考虑源荷不确定性的热电联供微网优化(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

华为云云耀云服务器L实例评测|云耀云服务器L实例部署Gogs服务器

华为云云耀云服务器L实例评测&#xff5c;云耀云服务器L实例部署Gogs服务器 一、云耀云服务器L实例介绍1.1 云耀云服务器L实例简介1.2 云耀云服务器L实例特点 二、Gogs介绍2.1 Gogs简介2.2 Gogs特点 三、本次实践介绍3.1 本次实践简介3.2 本次环境规划 四、远程登录华为云云耀云…

【Spring】IoC 与 DI

IoC 与 DI 1. IoC2. DI 1. IoC IoC (Inversion of Control): 控制反转控制反转: 表示应用程序的控制权&#xff08;对象的生命周期&#xff09;由应用程序自身的代码反转到容器或框架中。应用程序的组件不再直接控制其依赖项的创建和生命周期管理&#xff0c;而是委托给容器。…

微服务moleculer03

1. Moleculer 目前支持SQLite&#xff0c;MySQL&#xff0c;MariaDB&#xff0c;PostgreSQL&#xff0c;MSSQL等数据库&#xff0c;这里以mysql为例 2. package.json 增加mysql依赖 "mysql2": "^2.3.3", "sequelize": "^6.21.3", &q…

Windows下载AOSP

关于repo repo只是谷歌做的&#xff0c;方便下载安卓源码的工具&#xff0c;本质上是对下载清单进行批量处理&#xff0c;然后使用git克隆。 在windows上下载源码只需要自己处理即可。 具体做法 首先使用git克隆安卓源码清单 git clone https://mirrors.tuna.tsinghua.edu.…

1.Tensor For Beginner - Motivation

为何要研究张量&#xff1f; --主要原因是几何。 Tensors Geometry 了解张量后&#xff0c;可深入了解几何的工作原理 几何的一个例子&#xff1a;爱因斯坦广义相对论中的时空几何 时空是如何弯曲的&#xff0c;宇宙是如何膨胀的。 要从数学上理解这两个问题&am…

归并排序及其非递归实现

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 目录 归并排序递归实现 归并排序非递归实现 归并排序递归实现 图示&#xff1a; 代码&#xff1a; 先分再归并&#xff0c;像是后序一般。 //归并排序 void MergeSort(int* arr, int left, int right) {int* temp (int…

Pikachu靶场——越权访问漏洞(over permission)

文章目录 1. over permission1.1 水平越权1.1.1 源代码分析1.1.2 漏洞防御 1.2 垂直提权1.2.1 源代码分析1.2.2 漏洞防御 1.3 越权访问漏洞防御 1. over permission 漏洞描述 越权访问&#xff08;Broken Access Control&#xff0c;BAC&#xff09;&#xff0c;指应用在检查…

用python表格初级尝试

Excel&#xff0c;我的野心 当我输入3,2 就表示在第3行第2列。的单元格输入数据input输入表头 &#xff08;input内除了/&#xff0c;空格 回车 标点符号等 全部作为单元格分隔符&#xff09;由我设置input输入的是行or列 给选项 1. 行 2. 列默认回车或没输入值是列由我设置起…

SEO效果又慢又差,为什么还会有SEO从业者?

“SEO效果又慢又差&#xff0c;这么还会有SEO从业者&#xff1f;”这句话是我今天在某Q群里看到的&#xff0c;其实这个问题我之前也有写过一篇《你问我&#xff0c;为什么还有人做SEO&#xff1f;》。我文中提到过因为搜索无处不在&#xff0c;有搜索后&#xff0c;搜索引擎就…

JavaScript:从入门到进阶的旅程

JavaScript是一种广泛使用的编程语言&#xff0c;为网页和应用程序提供了交互性和动态性。从初学者到资深开发者&#xff0c;JavaScript都是一项值得掌握的技能。在本文中&#xff0c;我们将探讨JavaScript的基础知识&#xff0c;以及一些进阶的概念和技巧。 一、JavaScript简…

Linux系统编程系列之线程

一、什么是线程 线程&#xff08;Thread&#xff09;是计算机中的基本执行单元&#xff0c;是操作系统调度的最小单位。线程是进程内的一个独立执行流程&#xff0c;一个进程可以包含多个线程&#xff0c;这些线程共享进程的资源&#xff0c;但每个线程都有自己的独立栈空间以及…