热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

AndroidstudioActivity

Activity使用什么是ActivityActivity是一个Android的应用组件,它提供屏幕进行交互。每个Activity都会获得一个用于绘制其用户界面的


Activity使用


什么是Activity

Activity是一个Android的应用组件,它提供屏幕进行交互。每个Activity都会获得一个用于绘制其用户界面的窗口,窗口可以充满哦屏幕也可以小于屏幕并浮动在其他窗口之上。

一个应用通常是由多个彼此松散联系的Activity组成,一般会指定应用中的某个Activity为主活动,也就是说首次启动应用时给用户呈现的Activity。

将Activity设为主活动的方法,如下面代码所示需要在AndroidManifest文件中添加以下内容


     ....






        ....

在 android 中,Activity 拥有四种基本状态:

1.Active/Runing 一个新 Activity 启动入栈后,它在屏幕最前端,处于栈的最顶端,此时它处于可见并可和用户交互的激活状态。

2.Paused 当 Activity 被另一个透明或者 Dialog 样式的 Activity 覆盖时的状态。此时它依然与窗口管理器保持连接,系统继续维护其内部状态,所以它仍然可见,但它已经失去了焦点故不可与用户交互。

3.Stoped 当 Activity 被另外一个 Activity 覆盖、失去焦点并不可见时处于 Stop ed 状态。

4.Killed Activity 被系统杀死回收或者没有被启动时处于 Killed 状态。

如果一个活动在处于停止或者暂停的状态下,系统内存缺乏时会将其结束(finish)或者杀死(kill)。这种非正常情况下,系统在杀死或者结束之前会调用onSaveInstance()方法来保存信息,同时,当Activity被移动到前台时,重新启动该Activity并调用onRestoreInstance()方法加载保留的信息,以保持原有的状态。

当一个 Activity 实例被创建、销毁或者启动另外一个 Activity 时,它在这四种状态之间进行转换,这种转换的发生依赖于用户程序的动作。下图说明了 Activity 在不同状态间转换的时机和条件:

 

 


生命周期

在上面的四中常有的状态之间,还有着其他的生命周期来作为不同状态之间的过度,用于在不同的状态之间进行转换,生命周期的具体说明见下


函数

是否可终止

说明

onCreate()

Activity启动后第一个被调用的函数,常用来进行Activity的初始化,例如创建View、绑定数据或恢复信息等。

onStart()

当Activity显示在屏幕上时,该函数被调用。

onRestart()

当Activity从停止状态进入活动状态前,调用该函数。

onResume()

当Activity可以接受用户输入时,该函数被调用。

onPause()

当Activity进入暂停状态时,该函数被调用。主要用来保存持久数据、关闭动画、释放CPU资源等。该函数中的代码必须简短,因为另一个Activity必须等待该函数执行完毕后才能显示在界面上。

onStop()

当Activity不对用户可见后,该函数被调用,Activity进入停止状态。

onDestroy()

在Activity被终止前,即进入非活动状态前,该函数被调用。有两种情况该函数会被调用:(1)当程序主动调用finish()函数;(2)程序被Android系统终结。


  1. Activity 的整个生命周期发生在 onCreate() 调用与 onDestroy() 调用之间。您的 Activity 应在 onCreate()中执行“全局”状态设置(例如定义布局),并释放 onDestroy()中的所有其余资源。例如,如果您的 Activity 有一个在后台运行的线程,用于从网络上下载数据,它可能会在onCreate() 中创建该线程,然后在onDestroy() 中停止该线程。
  2. Activity 的可见生命周期发生在 onStart() 调用与 onStop() 调用之间。在这段时间,用户可以在屏幕上看到 Activity 并与其交互。例如,当一个新 Activity 启动,并且此 Activity 不再可见时,系统会调用onStop()。您可以在调用这两个方法之间保留向用户显示 Activity 所需的资源。例如,您可以在onStart() 中注册一个 BroadcastReceiver 以监控影响 UI的变化,并在用户无法再看到您显示的内容时在 onStop()中将其取消注册。在 Activity 的整个生命周期,当 Activity 在对用户可见和隐藏两种状态中交替变化时,系统可能会多次调用 onStart() 和 onStop()。
  3. Activity 的前台生命周期发生在 onResume() 调用与 onPause() 调用之间。在这段时间,Activity 位于屏幕上的所有其他 Activity 之前,并具有用户输入焦点。Activity 可频繁转入和转出前台 — 例如,当设备转入休眠状态或出现对话框时,系统会调用 onPause()。由于此状态可能经常发生转变,因此这两个方法中应采用适度轻量级的代码,以避免因转变速度慢而让用户等待。

调用演示:

创建项目,代码如下:

public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Log.e("Activity----->>>","onCreate");}/*** Activity从后台重新回到前台时被调用*/@Overrideprotected void onRestart() {super.onRestart();Log.e("Activity----->>>","onRestart");}/***Activity创建或者从后台重新回到前台时被调用*/@Overrideprotected void onStart() {super.onStart();Log.e("Activity----->>>","onStart");}/***Activity创建或者从被覆盖、后台重新回到前台时被调用*/@Overrideprotected void onResume() {super.onResume();Log.e("Activity----->>>","onResume");}/***  Activity被覆盖到下面或者锁屏时被调用*/@Overrideprotected void onPause() {super.onPause();Log.e("Activity----->>>","onPause");}/***退出当前Activity或者跳转到新Activity时被调用*/@Overrideprotected void onStop() {super.onStop();Log.e("Activity----->>>","onStop");;}/***退出当前Activity时被调用,调用之后Activity就结束了*/@Overrideprotected void onDestroy() {super.onDestroy();Log.e("Activity----->>>","onDestroy");}}

运行项目,查看日志:

点回退按钮,结束程序

重新运行,模拟电话呼入,接听时,查看日志

接完电话,回到页面

 

点home键

 

切换回来

 

调用另一个Activity

 

回退

 

横竖屏切换时候Activity的生命周期。

1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次

2、设置Activity的android:cOnfigChanges=”orientation”时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次

3、设置Activity的android:cOnfigChanges=”orientation|keyboardHidden”时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法


配置Activity

在manifest文件必须声明activity,为了它可以被系统访问。要声明activity,打开manifest文件,添加一个元素作为元素的子元素。

一条元素至少应该包含一个,否则任何Intent请求都不能和该匹配。如果Intent请求的Action和中个某一条匹配,那么该Intent就通过了这条的动作测试。

    android:label="AnotherActivity"
    android:theme="@style/AppTheme">





启动Activity

Intent intent=new Intent(MainActivity.this,AnotherActivity.class);startActivity(intent);

通过隐式启动activity


  1. Intent intent=Intent();
     intent.setAction(
    "com.li.another");
     startActivity(intent);

回退栈

启动系统的Activity

浏览网页


  • 打开浏览器,请问http://www.baidu.com
    Uri uri = Uri.parse("http://www.baidu.com");
            Intent it=
    new Intent(Intent.ACTION_VIEW,uri);
            startActivity(it);

调用发短信的程序
       Intent it = new Intent(Intent.ACTION_VIEW);
       it.putExtra("sms_body", "The SMS text");
       it.setType("vnd.android-dir/mms-sms");
       startActivity(it);

 发送短信
      Uri uri = Uri.parse("smsto:0800000123");
      Intent it = new Intent(Intent.ACTION_SENDTO, uri);
      it.putExtra("sms_body", "The SMS text");
      startActivity(it);


Activity之间传递参数

程序中可能有多个Activity,那么这些Activity是如何传递数据的呢?答案是使用Intent。

考虑有两个Activity的程序,一个是MainActivity,另一个是AnotherActivity。传递数据有两种情况:

MainActivity仅仅向AnotherActivity传递数据,但是不需要AnotherAcitivty向MainActivity回传数据

MainActivity不仅向AnotherActivity传递数据,还要求后者向前者回传数据。

使用Intent来帮助我们传递数据,Intent提供了多个方法来“携带”数据。

putExtras(Bundle data)

putExtra(String name,Xxx value) ,其中Xxx为类型

Intent也提供了相应的get方法来获得传递的数据。

Bundle getExtras()

Xxx getXxxExtra(String name),其中Xxx为类型

如在:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Button button=(Button)findViewById(R.id.buttonTest);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
 Intent intent=new Intent(MainActivity.this,AnotherActivity.class);
            intent.putExtra("name","Zhangsan");
            intent.putExtra("age",20);
            startActivity(intent);

        }
    });
}

接收方:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_another);

 Intent intent=getIntent();
    String name=intent.getStringExtra("name");
    Integer age=intent.getIntExtra("age", 20);
    Toast.makeText(this,name+age,Toast.LENGTH_LONG).show();


}


回传数据

有的时候MainActivity不但需要向其它Activity传递数据,当其它Activity处理完数据后还需要将处理结果返回给MainActivity。这怎么办呢?尤其是如果MainActivity中有多个按钮,每个按钮请求一个Activity,如下图所示,MainActivity又是如何区分是哪个Activity返回的结果呢?

首先MainActivity启动其它Activity应该使用startActivityForResult()方法。

该方法包括两个参数,第一个参数是Intent类型,第二个参数是请求码requestCode。例如单击Button0按钮启动ActivityOne,请求码是0,单击Button1按钮时某些情况下启动启动ActivityOne,请求码是1,某些情况下启动ActivityTwo,请求码是2等等

其次MainActivity应该重写onActivityResult()方法,当其它Activity返回结果后,系统会自动回调该方法。onActivityResult有三个参数

void onActivityResult(int requestCode, int resultCode, Intent data)

最后在AnotherActivity中需要将结果码和数据等通过setResult方法设置

Intent intent=getIntent();
String name=intent.getStringExtra("name");
Integer age=intent.getIntExtra("age", 20);
intent.putExtra("result","姓名:"+name+" 年龄"+age);
setResult(0,intent);
finish();

MainActivity中的代码

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
    setContentView(R.layout.
activity_main);
    Button button=(Button)findViewById(R.id.
buttonTest);
    button.setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View v) {
            Intent intent=
new Intent(MainActivity.this,AnotherActivity.class);
            intent.putExtra(
"name","Zhangsan");
            intent.putExtra(
"age",20);
            startActivityForResult(intent,
0);
        }
    });

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);

if(requestCode==0 && resultCode==0){
        String str=data.getStringExtra(
"result");
        Toast.makeText(
this,str,Toast.LENGTH_LONG).show();
    }

}

AnotherActivity中,需要回传数据的位置写入代码,如

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_another);

    Button button=(Button)findViewById(R.id.buttonReturn);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent=getIntent();
            String name=intent.getStringExtra("name");
            Integer age=intent.getIntExtra("age", 20);
            intent.putExtra("result","
姓名:"+name+" 年龄"+age);
            setResult(0,intent);
            finish();

        }
    });
}


任务栈

一个应用程序通常由多个activities组成,他们通常是松耦合关系。通常,一个应用程序中的activity被指定为"main"activity,当第一次启动应用程序的时候呈现给用户的那个activity。每一个activity然后可以启动另一个activity为了完成不同的动作。每一次一个activity启动,前一个activity就停止了,但是系统保留activity在一个栈上(“back stack”)。当一个新activity启动,它被推送到栈顶,取得用户焦点。Back Stack符合简单“后进先出”原则,所以,当用户完成当前activity然后点击back按钮,它被弹出栈(并且被摧毁),然后之前的activity恢复。

任务是指在执行特定作业时与用户交互的一系列 Activity。 这些 Activity 按照各自的打开顺序排列在堆栈(即返回栈)中。

任务是一个有机整体,当用户开始新任务或通过“主页”按钮转到主屏幕时,可以移动到“后台”。 尽管在后台时,该任务中的所有 Activity 全部停止,但是任务的返回栈仍旧不变,也就是说,当另一个任务发生时,该任务仅仅失去焦点而已。

 

启动模式(launchMode)在多个Activity跳转的过程中扮演着重要的角色,它可以决定是否生成新的Activity实例,是否重用已存在的Activity实例,是否和其他Activity实例公用一个task里。task是一个具有栈结构的对象,一个task可以管理多个Activity,启动一个应用,也就创建一个与之对应的task。

Activity一共有以下四种launchMode:

Standard默认选项

系统在启动 Activity 的任务中创建 Activity 的新实例并向其传送 Intent。Activity 可以多次实例化,而每个实例均可属于不同的任务,并且一个任务可以拥有多个实例。

singleTop

如果当前任务的顶部已存在 Activity 的一个实例,则系统会通过调用该实例的 onNewIntent() 方法向其传送 Intent,而不是创建 Activity 的新实例。Activity 可以多次实例化,而每个实例均可属于不同的任务,并且一个任务可以拥有多个实例(但前提是位于返回栈顶部的 Activity 并不是 Activity 的现有实例)。

singleTask

系统创建新任务并实例化位于新任务底部的 Activity。但是,如果该 Activity 的一个实例已存在于一个单独的任务中,则系统会通过调用现有实例的onNewIntent() 方法向其传送 Intent,而不是创建新实例。一次只能存在 Activity 的一个实例。

singleInstance

与 "singleTask" 相同,只是系统不会将任何其他 Activity 启动到包含实例的任务中。该 Activity 始终是其任务唯一仅有的成员;由此 Activity 启动的任何 Activity 均在单独的任务中打开。

定义TaskStackActivity和FirstActivity.

xml version="1.0"encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/activity_task_stack"
android:layout_match_parent"
android:layout_match_parent"
android:orientation="vertical">
<
TextView
android:layout_match_parent"
android:layout_wrap_content"
android:text="我是主activity"/>
<
Button
android:id="@+id/button"
android:layout_wrap_content"
android:layout_wrap_content"
android:OnClick="onClick1"
android:text="打开主activity"/>
<
Button
android:id="@+id/button1"
android:layout_wrap_content"
android:layout_wrap_content"
android:OnClick="onClick2"
android:text="打开FirstActivity"/>
LinearLayout>

TaskStack

public  void onClick1(View view){
    Intent intent=
new Intent(TaskStack.this,TaskStack.class);
    startActivity(intent);

}

public  void onClick2(View view){
    Intent intent=
new Intent(TaskStack.this,FirstActivity.class);
    startActivity(intent);

}

FirstActivity

public  void onClick1(View view){
    Intent intent=
new Intent(FirstActivity.this,TaskStack.class);
    startActivity(intent);

}

public  void onClick2(View view){
    Intent intent=
new Intent(FirstActivity.this,FirstActivity.class);
    startActivity(intent);

}

启动应用程序,点击打开FirstActivity->打开主activity->打开FirstActivity.点击返回键,观察页面变化。分析任务栈的内容。

在androidManifest.xml中将FirstActivity的android:launchMode="singleTop“

启动应用程序,点击打开FirstActivity->打开主activity->打开FirstActivity.多点几次打开FirstActivity,点击返回键,观察页面变化。分析任务栈的内容

在androidManifest.xml中将FirstActivity的android:launchMode="singleTask“

启动应用程序,点击打开FirstActivity->打开主activity, 点击返回键,观察页面变化。分析任务栈的内容

在androidManifest.xml中将FirstActivity的android:launchMode="singleInstance“

启动应用程序,点击打开FirstActivity->打开FirstActivity->打开主activity, 点击返回键,观察页面变化。分析任务栈的内容

MainActivity.java

package com.example.stone;import android.annotation.SuppressLint;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;public class MainActivity extends AppCompatActivity {int []images = new int[]{R.drawable.hand_cut,R.drawable.hand_stone,R.drawable.hand_bu};ImageView image,person;Handler handler;TextView computer_win,player_win,peace,result2;boolean flag=false;int temp=0;int j=0;int w=0,p=0;int total2=0;TextView result,total;@SuppressLint("HandlerLeak")@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);image=findViewById(R.id.computer);person=findViewById(R.id.person);person=findViewById(R.id.person);result=findViewById(R.id.result);total=findViewById(R.id.total);result2=findViewById(R.id.result2);computer_win=findViewById(R.id.computer_win);player_win=findViewById(R.id.player_win);peace=findViewById(R.id.peace);handler= new Handler(){@Overridepublic void handleMessage(@NonNull Message msg) {super.handleMessage(msg);switch (msg.what){case 0x01:image.setImageDrawable(getResources().getDrawable(images[msg.arg1]));break;}}};}public void click(View view){switch (view.getId()){case R.id.start:flag=true;computer();break;case R.id.Restart:flag=true;j=0;w=0;p=0;computer_win.setText("计算机胜利次数:"+ j);player_win.setText("玩家胜利次数:"+ w);peace.setText("平局次数:"+ p);result2.setText("");break;case R.id.bu:flag=false;person.setImageDrawable(getResources().getDrawable(R.drawable.hand_bu));image.setImageDrawable(getResources().getDrawable(images[temp]));if(temp==0){result.setText("不好意思,您输了!");computer_win.setText("计算机胜利次数:"+ ++j);}else if(temp==1){result.setText("恭喜您,取得了胜利!");player_win.setText("玩家胜利次数:"+ ++w);}else {result.setText("平局!");peace.setText("平局次数:"+ ++p);}total2=j+w+p;if(total2==10){if(j>w)result2.setText("计算机胜!结果是:" + j+ ":"+w);else if(jw)result2.setText("计算机胜!结果是:" + j+ ":"+w);else if(jw)result2.setText("计算机胜!结果是:" + j+ ":"+w);else if(j// image.setImageDrawable(getResources().getDrawable(images[i]));Message message =handler.obtainMessage();message.what=0x01; //相当于消息的id,用来区别其他的消息message.arg1=i;message.sendToTarget();//发送消息i++;if(i==images.length)i=0;try {sleep(500);} catch (InterruptedException e) {e.printStackTrace();}}}}.start();}
}

xml文件



 

 

 

 

 


推荐阅读
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 带添加按钮的GridView,item的删除事件
    先上图片效果;gridView无数据时显示添加按钮,有数据时,第一格显示添加按钮,后面显示数据:布局文件:addr_manage.xml<?xmlve ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • 深入理解CSS中的margin属性及其应用场景
    本文主要介绍了CSS中的margin属性及其应用场景,包括垂直外边距合并、padding的使用时机、行内替换元素与费替换元素的区别、margin的基线、盒子的物理大小、显示大小、逻辑大小等知识点。通过深入理解这些概念,读者可以更好地掌握margin的用法和原理。同时,文中提供了一些相关的文档和规范供读者参考。 ... [详细]
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • Android源码中的Builder模式及其作用
    本文主要解释了什么是Builder模式以及其作用,并结合Android源码来分析Builder模式的实现。Builder模式是将产品的设计、表示和构建进行分离,通过引入建造者角色,简化了构建复杂产品的流程,并且使得产品的构建可以灵活适应变化。使用Builder模式可以解决开发者需要关注产品表示和构建步骤的问题,并且当构建流程发生变化时,无需修改代码即可适配新的构建流程。 ... [详细]
  • Sleuth+zipkin链路追踪SpringCloud微服务的解决方案
    在庞大的微服务群中,随着业务扩展,微服务个数增多,系统调用链路复杂化。Sleuth+zipkin是解决SpringCloud微服务定位和追踪的方案。通过TraceId将不同服务调用的日志串联起来,实现请求链路跟踪。通过Feign调用和Request传递TraceId,将整个调用链路的服务日志归组合并,提供定位和追踪的功能。 ... [详细]
  • 抽空写了一个ICON图标的转换程序
    抽空写了一个ICON图标的转换程序,支持png\jpe\bmp格式到ico的转换。具体的程序就在下面,如果看的人多,过两天再把思路写一下。 ... [详细]
  • 今日份分享:Flutter自定义之旋转木马
    今日份分享:Flutter自定义之旋转木马-先上图,带你回到童年时光:效果分析子布局按照圆形顺序放置且平分角度子布局旋转、支持手势滑动旋转、快速滑动抬手继续旋转、自动旋转支持X轴旋 ... [详细]
  • 今天就跟大家聊聊有关怎么在Android应用中实现一个换肤功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根 ... [详细]
  • Android系统移植与调试之如何修改Android设备状态条上音量加减键在横竖屏切换的时候的显示于隐藏
    本文介绍了如何修改Android设备状态条上音量加减键在横竖屏切换时的显示与隐藏。通过修改系统文件system_bar.xml实现了该功能,并分享了解决思路和经验。 ... [详细]
author-avatar
海滨2502940147
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有