Android移动应用开发--activity的生命周期和启动模式以及intent的分类

如何创建一个新的activity

Android的四大组件都要在清单文件里进行配置
如果想要让应用有多个启动图标,新建的activity需要配置:

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

activity下的label和icon属性可以和application节点的属性不一样,默认用的是application下的属性
一个Android应用一般我们配置一个启动图标就可以了,可以通过其他页面跳转

intent的分类

隐式意图

通过指定的一组动作或数据开启activity
/**
以从MainActivity跳转到TestActivity为例
清单文件
*/
 <activity android:name=".TestActivity">

        <!-- 意图过滤器 -->
        <intent-filter>
            <action android:name="com.dsl.testactivity" />

            <data
                android:mimeType="aa/bb1"
                android:scheme="dsl1" />

            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>
    /**
    跳转代码
    */
       //创建意图对象
    Intent intent = new Intent();
    //设置跳转的动作
    intent.setAction("com.dsl.testactivity");
    //设置Category     intent.addCategory("android.intent.category.DEFAULT");
    //设置数据
 //   intent.setData(Uri.parse("dsl:"+110));
    //设置数据类型
   // intent.setType("aa/bb");
    //如果setdata和setType一起使用时,应该使用下面的方法
    intent.setDataAndType(Uri.parse("dsl1:"+110),"aa/bb1");
    //开启意图
    startActivity(intent);

显示意图

通过指定具体的包名和类名
 Intent intent = new Intent(this,Test2Activity.class);
    //设置当前activity的包名和指定activity的类名
  //  intent.setClassName("com.dsl.newactivity","com.dsl.newactivity.TestActivity");
    startActivity(intent);

总结:
开启自己应用的界面用显示意图
开启其他界面(系统应用)用隐式界面‘
显示意图更安全

activity的生命周期

onCreate方法
onDestory方法 当activity销毁的时候调用
onstop方法当activity页面不可见
onstart方法当activity界面变成可视的时候调用
onresume方法 界面有按钮可以被点击了,获取了焦点
onpause方法 界面上按钮不可以被点击了,失去焦点
package com.dsl.activitycycle;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        System.out.println("onCreate");

    }
    public void click(View v){
        Intent intent = new Intent(this, TestActivity.class);
        startActivity(intent);
    }

    //当activity销毁的时候调用
    @Override
    protected void onDestroy() {
        System.out.println("onDestroy");

        super.onDestroy();
    }

    //当activity可见的时候
    @Override
    protected void onStart() {
        super.onStart();
        System.out.println("onStart");
    }

    @Override
    protected void onRestart() {
        System.out.println("onRestart");
        super.onRestart();
    }

    //界面不可见
    @Override
    protected void onStop() {
        super.onStop();
        System.out.println("onStop");
    }

    //当界面上的按钮可以被点击的时候(可以进行交互)
    @Override
    protected void onResume() {
        System.out.println("onResume");
        super.onResume();
    }

    @Override
    protected void onPause() {
        System.out.println("onPause");
        super.onPause();
    }
}

任务栈的概念

打开一个activity叫进栈,关闭一个activity叫出栈
我们操作的activity永远是栈顶的activity
任务栈是用来维护用户操作体验的
应用程序退出了,是任务栈清空了
一般情况下一个应用程序对应一个任务栈

activity的四种启动模式

singleInstance:activity会运行在自己的任务栈里,并且这个任务栈里只有一个实例存在,如果想要保证一个activity在整个手机操作系统里面只有一个实例存在,使用singleInstance
应用场景:来电页面
singleTop:单一顶部模式,如果任务栈的栈顶存在这个要开启的activity,不会重新创建,而是复用之前的,保证栈顶如果存在,不会重新创建
应用场景:浏览器的书签
singleTask:在当前的任务栈里只有一个实例存在,当开启activity的时候,就去检查在任务栈里面是否有实例存在,如果有,就复用这个已经存在的,并且把这个activity上面的所有的别的activity都清空,复用这个已经存在的activity,保证任务栈里只有一个实例存在
应用场景:浏览器的activity
standard:标准模式

intent的案例

人品计算器(显示意图)

/**
MainActivity类:获取用户输入的姓名和性别,并将用户输入的数据传递给指定的activity
*/
package com.dsl.a2_charactercalculator;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.EditText;
import android.widget.RadioGroup;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    EditText et_name;
    RadioGroup rg;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        et_name = findViewById(R.id.et_name);
        rg = findViewById(R.id.rg);
    }
    public void click (View v){
        String name = et_name.getText().toString().trim();
        if (TextUtils.isEmpty(name)){
            Toast.makeText(getApplicationContext(),"亲,请输入你的名字",Toast.LENGTH_SHORT).show();
            return;
        }
        int radioButton = rg.getCheckedRadioButtonId();
        int sex = 0;
        switch (radioButton) {
            case R.id.male:
                sex = 1;
                break;
            case R.id.female:
                sex = 2;
                break;
            case R.id.other:
                sex = 3;
                break;
        }
        if (sex == 0){
            Toast.makeText(getApplicationContext(),"请选择你的性别",Toast.LENGTH_SHORT).show();
            return;
        }
		//显示意图跳转界面
        Intent intent = new Intent(this, ResultActivity.class);
        //传递数据
        intent.putExtra("name",name);
        intent.putExtra("sex",sex);
        startActivity(intent);
    }
}
/**
ResultActivity:用于随机生成一个人品判断的结果,并显示在控件上
*/

package com.dsl.a2_charactercalculator;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.media.tv.TvView;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

import java.util.Random;

public class ResultActivity extends AppCompatActivity {
    TextView tv_name;
    TextView tv_sex;
    TextView tv_personality;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_result);
        tv_name  = findViewById(R.id.tv_name);
        tv_sex = findViewById(R.id.tv_sex);
        tv_personality = findViewById(R.id.tv_personality);
        Intent intent = getIntent();//获取开启此activity的意图对象
        //获取传递的值
        String name = intent.getStringExtra("name");
        int sex = intent.getIntExtra("sex", 0);
        tv_name.setText(name);
        byte [] bytes = null;
       try {
           switch (sex){
               case 1:
                   tv_sex.setText("男");
                   bytes =  name.getBytes("utf-8");
                   break;
               case 2:
                   bytes =  name.getBytes("gbk");
                   tv_sex.setText("女");
                   break;
               case 3:
                   bytes =  name.getBytes("utf-16");
                   tv_sex.setText("人妖");
                   break;
           }
       }catch (Exception e){
           e.printStackTrace();
       }

        int total = 0;
        for (byte b :bytes){
            int num = b&00101000;
            total+=num;
        }
        int score = Math.abs(total)%100;

        System.out.println("score:"+score);
        if (score>90){
            tv_personality.setText("人品极好,命犯桃花");
        }else if(score>70){
            tv_personality.setText("人面桃花 会遇到你的。。。");
        }else if(score>60){
            tv_personality.setText("你的人品才刚刚及格,最近可能有桃花运");
        }else{
            tv_personality.setText("你要注意了,您的人品不太好,要努力啊");
        }

    }
}

/**
activity_main 布局
*/
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <EditText
        android:id="@+id/et_name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:padding="5dp"
        android:hint="请输入你的名字" />

    <RadioGroup
        android:id="@+id/rg"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:orientation="horizontal">

        <RadioButton
            android:id="@+id/male"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="男" />

        <RadioButton
            android:id="@+id/female"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="女" />

        <RadioButton
            android:id="@+id/other"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="人妖" />


    </RadioGroup>

    <Button
        android:layout_marginTop="20dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="click"
        android:text="计算" />

</LinearLayout>
/**
activity_result 布局
*/
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="vertical"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".ResultActivity">
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/tv_name"
        android:layout_margin="10dp"
        android:padding="5dp"
        android:text="张三"/>
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:padding="5dp"
        android:id="@+id/tv_sex"
        android:text="男"/>
    <TextView
        android:layout_margin="10dp"
        android:padding="5dp"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/tv_personality"
        android:text="你人不错"/>

</LinearLayout>

短信大全(隐式意图)

/**
MainActivity:通过点击我们事先准备好的文字,通过系统自带的短信功能发送信息
*/
package com.dsl.messageAll;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class MainActivity extends AppCompatActivity {
    ListView lv;
    String[] obj = {"我喜欢你,喜欢的只是一个现在;我爱你,爱的却是一整个未来。如果是决定离开了一个人,那么你行动是要快一点,快刀斩乱麻;如果决定爱上一个人,时间要拉长一点,看清楚他是否真的适合你。",
            "不需要海枯石烂的山盟海誓,只需一生一世的默默相守;不需要多么奢华的烛光晚餐,只需两个人,一桌粗茶淡饭;不需要有座别墅,面朝大海,春暖花开,只需一套小小房子,落地窗,一米阳光。这就是爱,平淡却幸福着;这就是爱,简单并快乐着。",
            "心理学家发现:一个人说的话若90%以上是废话,他就快乐。若废话不足50%,快乐感则不足。在交流中,没有太强目的性的语言,更容易让人亲近。----所以,我们每天都在找“幸福”。幸福是什么呢?大概就是找到了一个愿意听你说废话的人。",
            "朋友们,在确认她成为你女朋友之前,先带她去游泳吧,有3个好处。1、看身材,没有过多的衣服,藏也藏不住。2、看素颜,在水里,什么遮瑕膏粉底霜,都将不复存在。3、等她学会了游泳,就不会问,你妈和我一起落水,你先救谁的问题了……"};
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        lv = findViewById(R.id.lv);
        ArrayAdapter<String> adapter = new ArrayAdapter<>(this, R.layout.item,R.id.tv ,obj);
        lv.setAdapter(adapter);
        //给item设置点击事件
       lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
           @Override
           public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
               String content = obj[position];
               Intent intent = new Intent();
               //设置action
               intent.setAction("android.intent.action.SEND");
               //设置category
               intent.addCategory("android.intent.category.DEFAULT");
               //设置type
               intent.setType("text/plain");
               //传送数据
               intent.putExtra("sms_body",content);
               startActivity(intent);
           }
       });
    }
}
/**
item.xml 模板文件
*/
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:orientation="vertical"
    android:layout_height="match_parent">
<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/tv"/>
</LinearLayout>

/**
activity_main 文件
*/
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"
    tools:context=".MainActivity">

   <ListView
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       android:id="@+id/lv"/>

</RelativeLayout>

短信发送器案例(模仿短信)

ContactPersonActivity类
通过点击listview中的item获取联系人的电话
package com.dsl.messageSend;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;

public class ContactPersonActivity extends AppCompatActivity {
    ListView lv;
    List<Person> list = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_contact_person);
        lv = findViewById(R.id.lv);

        for (int i = 0; i < 20; i++) {
            Person person = new Person();
            person.setName("张三" + i);
            person.setPhone("011" + i);
            list.add(person);
        }

        lv.setAdapter(new MyAdapter());
        lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                String phone = list.get(position).getPhone();
                //把数据返回给调用者
                Intent intent = new Intent();
                intent.putExtra("phone", phone);
                //把结果返回给调用者
                setResult(10, intent);

                //关闭当前页面
                finish();

            }
        });
    }

    @Override
    public void onBackPressed() {
        super.onBackPressed();
    }
	//自定义适配器,用于显示事先准备好的联系人
    class MyAdapter extends BaseAdapter {

        @Override
        public int getCount() {
            return list.size();
        }

        @Override
        public Object getItem(int position) {
            return null;
        }

        @Override
        public long getItemId(int position) {
            return 0;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View view;
            if (convertView == null) {
                view = View.inflate(getApplicationContext(), R.layout.contact_item, null);
            } else {
                view = convertView;
            }
            TextView tv_name = view.findViewById(R.id.tv_name);
            TextView tv_phone = view.findViewById(R.id.tv_phone);
            tv_name.setText(list.get(position).getName());
            tv_phone.setText(list.get(position).getPhone());
            return view;
        }
    }
}

activity_contact_person.xml文件
定义listview的布局文件
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".ContactPersonActivity">

    <ListView
        android:id="@+id/lv"
        android:layout_width="match_parent"
        android:layout_height="match_parent">



    </ListView>
</RelativeLayout>
contact_item.xml
定义listview的模板文件
<?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">

    <TextView
        android:id="@+id/tv_name"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:gravity="center_horizontal"
        android:text="aaa"
        android:textSize="20sp" />

    <TextView
        android:id="@+id/tv_phone"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:gravity="center_horizontal"
        android:text="110"
        android:textSize="20sp" />
</LinearLayout>

TemplateActivity类
将事先准备的短信内容,通过点击事件返回给调用者
package com.dsl.messageSend;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class TemplateActivity extends AppCompatActivity {
String obj [] = {"我在吃饭,稍后联系","我在学习,稍后联系","我在谈恋爱,稍后联系","我在敲代码,稍后联系","我在睡觉,稍后联系"};
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_template);
        ListView lv2 = findViewById(R.id.lv2);
        ArrayAdapter arrayAdapter = new ArrayAdapter(getApplicationContext(),R.layout.item,R.id.tv,obj);
        lv2.setAdapter(arrayAdapter);
        lv2.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                String content = obj[position];
                //把数据返回给调用者
                Intent intent = new Intent();
                intent.putExtra("content",content);
                //返回数据
                setResult(20,intent);
                finish();
            }
        });
    }
}

activity_template.xml
定义显示短信模板的listview
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".TemplateActivity">
    <ListView
        android:id="@+id/lv2"
        android:layout_width="match_parent"
        android:layout_height="match_parent">



    </ListView>

</LinearLayout>
item.xml
activity_template.xml中list的item条目文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:orientation="vertical"
    android:layout_height="match_parent">
<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textColor="#000000"
    android:id="@+id/tv"/>
</LinearLayout>

MainActivity
将获取到的电话和短信模板内容显示到控件上
package com.dsl.messageSend;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.telephony.SmsManager;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {
    EditText et_num;
    EditText et_content;
    String number;
    String content;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        et_num  = findViewById(R.id.et_num);
        et_content = findViewById(R.id.et_content);
    }
    public void add(View v){
        Intent intent = new Intent(this,ContactPersonActivity.class);
  //      startActivity(intent);
        //如果点击按钮开启了另外一个activity,并且当开启的这个activity关闭的时候,我想要这个开启的activity的数据,用下面这个方法
        startActivityForResult(intent ,1);
    }

    //当我们开启的activity页面关闭的时候就调用这个方法
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        //如果使用请求码也一样
        if (resultCode == 10){
            //说明数据来自ContactPersonActivity
            String phone = data.getStringExtra("phone");
            et_num.setText(phone);
        }else if(resultCode == 20){
            //说明数据来自TemplateActivity
            String content = data.getStringExtra("content");
            et_content.setText(content);
        }

        super.onActivityResult(requestCode, resultCode, data);
    }
    public void insert(View v){
        Intent intent = new Intent(this,TemplateActivity.class);
        startActivityForResult(intent,2);

    }
    public void send(View v){
        number = et_num.getText().toString().trim();
        content = et_content.getText().toString().trim();


        if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.
                permission.SEND_SMS) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(MainActivity.this, new
                    String[]{Manifest.permission.SEND_SMS}, 1);
        } else {
            sengSmS(number,content);
        }


    }
    public void sengSmS(String number,String content){
        //获取SmsManager实例
        SmsManager smsManager = SmsManager.getDefault();
        //将短信分片,以防内容过多
        ArrayList<String> strings = smsManager.divideMessage(content);
        for (String i :strings){
            /**
             * 第一个参数:发送给谁
             * 第二个参数:服务中心的号码
             * 第三个参数:要发送的内容
             */
            smsManager.sendTextMessage(number,null,i,null,null);
        }
    }
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode) {
            case 1:
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    sengSmS(number,content);
                } else {
                    Toast.makeText(this, "You denied the permission", Toast.LENGTH_SHORT).show();
                }
                break;
            default:
        }
    }

}

activity_main.xml
主界面的展示
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:orientation="vertical"
    tools:context=".MainActivity">

    <RelativeLayout

        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <EditText
            android:inputType="phone"
            android:id="@+id/et_num"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="请输入手机号码" />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignBottom="@+id/et_num"
            android:layout_alignParentRight="true"
            android:onClick="add"
            android:text="+" />

    </RelativeLayout>

    <EditText
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:id="@+id/et_content"
        android:gravity="top"
 android:hint="请输入短信的内容"
        />
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="插入短信模板"
        android:onClick="insert"/>
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="发送"
            android:onClick="send"/>
</LinearLayout>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

何一平?

你的收获就是我学习的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值