免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3728 | 回复: 17
打印 上一主题 下一主题

《android编程宝典》-连载。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-04-15 14:20 |只看该作者 |倒序浏览
内容简介
《Android编程宝典》讲解Android手机平台开发从入门到精通的相关知识,全书内容共分为3篇。
  第1篇是Android基础编程,主要介绍Android平台编程的基础知识,包括活动、意图、广播接受者、用户界面布局、常用控件、菜单、通知、闹钟服务、事件处理、数据存储、内容提供者以及Android异步处理机制等相关内容。基础编程这一篇所涉及的知识点贯穿于Android客户端开发工作的始终,是进行Android客户端开发的一条重要线索。
  第2篇是Android高级编程,主要介绍Android平台编程的高级知识,包括服务、基于位置的服务、网络编程、多媒体、传感器、图形和图像、硬件接口以及Android的桌面组件等相关内容。
  第3篇是Android实战应用。此篇介绍了一个基于B/S架构的电子订餐系统,包括Android客户端的开发以及服务端的开发等相关知识,服务端采用了完整的JAVA EE分层架构,整个应用具有良好的可扩展性和示范性。
  本书并不局限于枯燥的理论介绍,而是采用实例的方式来讲授知识点,以便读者可以更好地阅读以及进行相关知识点的理解和发散。在内容上,涉及当前移动互联网领域一些拥有大量用户数的客户端应用的一些特色功能的原理介绍以及代码实现。
  如果读者对Java语法比较熟悉,并且有一定的事件驱动的程序编程经验,那么阅读本书就可以很快掌握Android应用开发。本书适合想全面学习Android开发的人员阅读,对经常使用Android平台做开发的人员,更是一本不可多得的案头必备参考书。

论坛徽章:
0
2 [报告]
发表于 2013-04-15 14:23 |只看该作者
《Android编程宝典》
第一篇Android基础编程
第1章 初识Android
1.1  为什么要开发Android应用程序
1.1.1  Google Play
1.1.2  开放平台
1.1.3  兼容性
1.1.4  聚合能力
1.2  搭建Android开发环境
1.2.1  Android源码
1.2.2  Android整体架构
1.2.3  搭建Android开发环境
1.2.4  下载和安装JDK
1.2.5  下载和安装Eclipse和ADT
1.2.6  安装Android SDK
1.2.7  管理模拟器
1.3  编写Hello World
1.3.1   新建Hello World工程
1.3.2   运行Hello World工程
1.3.3   Hello World工程目录结构分析
1.3.4   AndroidManifest.xml文件分析
1.4  Android编程基础
1.4.1  Java语言
1.4.2  活动(Activity)
1.4.3  意图(Intent)
1.4.4  广播接收者(Broadcast Receiver)
1.4.5  服务(Service)
1.4.6  视图(View)和用户界面控件(Widget)
1.4.7  异步调用
1.4.8  android应用程序声明周期
第2章 活动
2.1  创建活动
2.1.1  新建活动
2.1.2  新建用户界面
2.2  理解活动生命周期   
2.2.1  活动生命周期
2.2.2  LogCat的使用
2.3  活动的启动模式(android:launchMode)
2.4  活动运用样式和主题
2.5  隐藏活动标题栏
2.6  弹出对话框
2.7  弹出进度条对话框
第3章 意图和广播接收者
3.1  意图激活Activity
3.1.1  Activity之间的跳转
3.1.2  Intent传递数据
3.1.3  跳转至其他活动并获取结果
3.2  隐式意图
3.2.1  意图过滤器
3.2.2  Android隐式意图的解析
3.2.3  隐式意图使用实例
3.2.4  意图打开内置应用程序组件
3.3  广播接受者
3.3.1  XML方式注册广播接受者
3.3.2  代码方式注册广播接受者
第4章 用户界面
4.1  用户界面组件
4.1.1  View和ViewGroup
         4.1.2  LinearLayout(线性布局)
         4.1.3  AbsoluteLayout(绝对布局)
                 4.1.4  TableLayout(表格布局)
         4.1.5  RelativeLayout(相对布局)
         4.1.6  FrameLayout(帧布局)
         4.1.7  ScrollView(滚动视图)
         4.1.8  Java代码方式布局
4.2  屏幕方向改变
4.2.1  理解屏幕方向改变
4.2.2  适应方向改变
第5章 常用控件
5.1  基本界面组件
5.1.1  文本框(TextView)和编辑框(EditText)
5.1.2  按钮(Button)和图片按钮(ImageButton)
5.1.3  单选按钮(RadioButton)和单选按钮组(RadioGroup)
5.1.4  复选按钮(CheckBox)
5.1.5  状态开关按钮(ToggleButton)
5.1.6  图像视图(ImageView)
5.2  高级界面控件
    5.2.1  自动完成文本框(AutoCompleteTextView)
5.2.2  下拉列表(Spinner)
5.2.3  日期选择器(DatePicker)和时间选择器(TimerPicker)
5.2.4  进度条(ProgressBar)和拖动条(SeekBar)
5.2.5  星级评分条(RatingBar)
5.2.6  列表视图(ListView)
5.2.7  网络视图(GridView)
第6章 菜单,通知以及闹钟服务
6.1  菜单
6.1.1 选项菜单
6.1.2 上下文菜单
6.1.3 子菜单
6.2  通知
6.2.1  普通通知
6.2.2  自定义视图通知
6.2.3  高级通知技术
6.3  闹钟服务
第7章 Android事件处理
7.1  Android事件处理概括介绍
7.1.1  基于监听器的事件处理机制
7.1.2  基于回调的事件处理机制
7.2  监听和处理用户单击事件
7.2.1  匿名内部类作为事件监听器类
7.2.2  内部类作为事件监听器类
7.2.3  Activity本身作为事件监听器类
7.3  监听和处理键盘事件
7.3.1  监听处理onKeyDown事件
7.3.2  监听处理onKeyUp事件
    7.4  自定义监听器
7.5  基于回调的事件处理
7.5.1  创建自定义视图
7.5.2  回调处理onKeyDown事件
7.5.3  回调处理onKeyUp事件
7.5.4  回调处理触摸事件
7.5.5  Android的手势识别
第8章 数据存储
8.1  SharedPreferences(系统偏好设置)
8.1.1  SharedPreferences数据存储
8.2  PreferenceActivity
8.2.1  CheckBoxPreference
8.2.2  EditTextPreference
8.2.3  ListPreference
8.2.4  RingtonePreference
8.2.5  PreferenceCategory
8.3  文件存储
8.3.1  内部存储
8.3.2  外部存储
8.4  SQLite数据库存储
第9章 内容提供者
9.1  Android内置内容提供者
9.1.1  内置内容提供者
9.1.2  使用内置内容提供者
9.2  自定义内容提供者
第10章 Android异步处理机制
10.1  子线程
         10.1.1  实现Runnable接口
         10.1.2  继承Thread类
         10.1.3  Android创建子线程
10.2  Handler的使用
         10.2.1  Android消息机制
10.2.2  Handler更新UI界面
         10.2.3  Handler发送Runnable对象
10.2.4  runOnUiThread函数的使用
10.2  Handler的使用   
第二篇Android高级编程
第11章 服务
11.1  Service介绍
11.1.1  Service启动方式
11.1.2  Service基础  
11.2  本地服务
11.2.1  不需要与组件交互本地服务
11.2.2  本地服务结合广播接收者
11.2.3  与组件交互本地服务
11.2.4  Service与Thread的区别
11.3  远程服务
11.3.1  AIDL实例
11.3.2  远程服务实例
第12章 LBS
12.1  定位
12.1.1  手机定位的方式
12.1.2  GPS定位
12.1.3  基站定位
12.1.4  WIFI定位
12.2  Google Maps
12.2.1  下载Google Maps
12.2.2  获取Google Mpas API Key
12.2.3  MapView的使用
12.2.4  地图标记的使用
第13章 网络编程
13.1  网络获取数据
13.1.1  网络下载图片
13.1.2  网络下载文本数据      
13.2  XML解析
          13.2.1  DOM解析技术
                13.2.2  SAX解析技术
          13.2.3  Pull解析技术      
13.3  JSON数据解析
13.4  HttpClient
13.4.1  HttpClient发送HttpGet请求
13.4.2  HttpClient发送HttpPost请求
13.5  Android调用WebService查询号码归属地
13.6  Android Tcp Socket
第14章 多媒体
14.1  音频播放
     14.1.1   MediaPlayer的介绍
     14.1.2         MediaPlayer播放音频            
14.2  视频播放
14.2.1   自带播放器播放视频
14.2.2   VideoView播放视频
14.2.3   MediaPlayer结合SurfaceView播放视频
14.3  音频录制
14.4  视频录制
14.5  TTS的使用
第15章 传感器
15.1  传感器入门
15.1.1   获取传感器类别
15.1.2   监听传感器事件
15.2  仿微信摇一摇功能        
15.3  方向传感器
第16章 Android图形和图像
16.1  图片浏览器
16.1.1  Gallery
16.1.2  Gallery和ImageSwitcher
16.2  访问图片
16.2.1  Drawable
16.2.2  Bitmap和BitmapFactory
16.3  内存优化
16.3.1  Drawable与Bitmap占用内存比较
16.3.2  decodeResource方法与decodeStream效率
16.3.3  防止内存溢出
16.4  2D绘图
16.4.1  View类
16.4.2  SurfaceView类
16.4.3  Canvas(画布)和Paint(画笔)
16.5  Android动画
16.5.1  补间动画
16.5.2  渐变动画(AlphaAnimation)
16.5.3  尺寸变化动画(ScaleAnimation)
16.5.4  位置变化动画(TranslateAnimation)
16.5.5  旋转变化动画(RotateAnimation)
16.5.6  逐帧动画(Frame Animation)
第17章 Android硬件接口
17.1  蓝牙基本介绍
17.1.1  蓝牙工作流程
17.1.2  蓝牙编程核心类
17.1.3  蓝牙权限
17.1.4  找寻周围蓝牙设备
17.2  Telephony介绍
17.2.1  使用Telephony Manager
17.2.2  广播接收者监听来电信息
17.2.3  广播接收者监听去电信息
17.3  系统和控制设备
17.3.1  设置声音模式
17.3.2  获取安装程序列表
17.3.3  控制设备振动
17.3.4  管理网络和WIFI链接
第18章 Android桌面组件
18.1  实时文件夹
         18.1.1  使用实时文件夹
         18.1.2  实时文件夹实例
    18.2  快捷方式       
    18.3  桌面插件(Widget)
     18.3.1  使用Widget
     18.3.2  AppWidget框架类
     18.3.3  桌面插件(Widget)实例   
第三篇Android实战应用

第19章 电子订餐系统
19.1  系统功能简介和架构设计
         19.1.1  系统功能简介
         19.1.2  系统架构设计
    19.2  发送Http请求的工具类       
19.3  用户注册
             19.3.1  用户注册Servlet
         19.3.2  用户模型
                 19.3.3  用户DAO
         19.3.4  用户注册
19.4  用户注册
             19.4.1  用户登录Servlet
         19.4.2  用户登录       
19.5  菜品展示
             19.5.1  菜品展示Servlet
         19.5.2  菜品模型
                 19.5.3  菜品DAO
         19.5.4  菜品展示
19.6  菜品详情
19.7  购物车
         19.7.1  购物车总计
                 19.7.2  修改购物车
         19.7.3  下单

论坛徽章:
0
3 [报告]
发表于 2013-04-15 14:24 |只看该作者
本帖最后由 didimm 于 2013-04-15 14:25 编辑

第7章 Android事件处理
   对于一个Android应用程序来说,事件处理是必不可少的,用户与应用程序之间的交互便是通过事件处理来完成的。在前面的章节当中,读者朋友们已经学习了很多的用户界面组件,并且已经学会了对他们的熟练使用。在本章当中,笔者将要和读者朋友们一起去探索如何使用Android的事件处理,从而当相关用户界面事件发生之后,根据具体需要,完成相应的业务逻辑操作。本章主要包含以下内容:
        Android事件处理概括介绍
        监听和处理用户单击事件
        监听和处理键盘事件

论坛徽章:
0
4 [报告]
发表于 2013-04-15 14:25 |只看该作者
7.1  Android 事件处理概括介绍
无论是在Java图形用户界面程序的开发过程当中,还是在Android应用程序的开发过程当中,用户都是通过事件驱动的方式与设备进行交互的,这些事件都是通过各种各样的输入设备而产生的,比如:触摸屏、键盘等。Android平台提供了两种事件处理的机制,分别是基于监听器的事件处理机制以及基于回调的事件处理机制。
7.1.1 基于监听器的事件处理机制
对于基于监听器的事件处理而言,主要就是为Android用户界面组件绑定特定的事件监听器。
相比于基于回调的事件处理,这是更具“面向对象”性质的事件处理方式。在监听器模型中,主要涉及三类对象:
        事件源(Event Source):产生事件的来源,通常是指各种用户界面组件,比如按钮,文本框等。
        事件(Event):事件封装了用户界面组件上发生的特定事件的具体信息,如果监听器需要获取用户界面组件上所发生事件的相关信息,一般通过事件Event对象来传递。
        事件监听器(Event Listener):负责监听事件源发生的事件,用来负责对不同的事件做出相应的处理。
基于监听器的事件处理机制是一种委托式的事件处理方式,事件源将整个事件委托给事件监听器,由事件监听器对事件进行响应处理。这种处理方式将事件源和事件监听器分离开来,有利于增强程序的可维护性,减少程序的耦合度。
举例:
View类中的OnLongClickListener监听器定义如下:(不需要传递事件)
public interface OnLongClickListener
{  
    boolean onLongClick(View v);  
}
View类中的OnTouchListener监听器定义如下:(需要传递事件MotionEvent)
public interface OnTouchListener
{  
    boolean onTouch(View v, MotionEvent event);  
}

论坛徽章:
0
5 [报告]
发表于 2013-04-15 14:26 |只看该作者
7.1.2 基于回调的事件处理机制
对于基于回调的事件处理而言,主要做法是重写Android用户界面组件特定的回调函数,Android大部分用户界面组件都提供了事件响应的回调函数,开发者重写这些方法就可以了。
相比基于监听器的事件处理模型,基于回调的事件处理模型要简单些,该模型中,事件源和事件监听器是合一的,也就是说没有独立的事件监听器存在。当用户在GUI组件上触发某事件时,由该组件自身特定的函数负责处理该事件。通常通过重写Override用户界面组件的事件处理函数实现事件的处理。
举例:
View类实现了KeyEvent.Callback接口中的一系列回调函数,因此,基于回调的事件处理机制通过自定义View来实现,自定义View时重写这些事件处理方法即可。
public interface Callback {  
    // 几乎所有基于回调的事件处理函数都会返回一个boolean类型值,该返回值用于  
    // 标识该处理函数是否能完全处理该事件  
// 返回true,表明该函数已完全处理该事件,该事件不会继续传播出去  
// 返回false,表明该函数未完全处理该事件,该事件会继续传播出去
    boolean onKeyDown(int keyCode, KeyEvent event);  
    boolean onKeyLongPress(int keyCode, KeyEvent event);  
    boolean onKeyUp(int keyCode, KeyEvent event);  
    boolean onKeyMultiple(int keyCode, int count, KeyEvent event);  
}
综上所述:基于监听器的事件模型符合单一职责原则,事件源和事件监听器分开实现。Android的事件处理机制保证基于监听器的事件处理会优先于基于回调的事件处理被触发。某些特定情况下,基于回调的事件处理机制会更好的提高程序的内聚性。

论坛徽章:
0
6
发表于 2013-04-15 14:37
本帖最后由 didimm 于 2013-04-15 14:38 编辑

[7.2  监听和处理用户单击事件
用户界面组件的单击事件是Android应用程序当中最常用到的事件类型。下面通过实例的方式为读者朋友们来介绍如何通过绑定监听器的方式来监听和处理用户界面组件的单击事件。可以采用匿名内部类,内部类或者是Activity本身来作为事件监听器类,下面为读者朋友一一介绍。
7.2.1 匿名内部类作为事件监听器类
下面的实例采用匿名内部类来作为按钮控件的单击事件监听器类。
(1)新建工程chapter7_1,编辑res/layout/activity_main.xml文件,源代码参考光盘。
(2)编辑MainActivity.java文件,源代码如下:
public class MainActivity extends Activity
{
        TextView mTextView;//声明文本控件
        Button mMyButton;//声明按钮控件
    @Override
public void onCreate(Bundle savedInstanceState)
{
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mTextView = (TextView)findViewById(R.id.my_textview);//找到文本控件
        mMyButton = (Button)findViewById(R.id.my_button);//找到按钮控件
        //采用匿名内部类的方式作为按钮单击事件的监听器
        mMyButton.setOnClickListener(new OnClickListener()
{
                        @Override
                        public void onClick(View v)
{//当用户单击按钮时,触发onClick方法
                                mTextView.setText("Button has been clicked");  //设置文本内容
                        }
                });
    }
    @Override
public boolean onCreateOptionsMenu(Menu menu)
{
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
}
在Android应用程序开发的过程当中,大多数的事件监听器都是以匿名内部类的形式存在的,这是由于事件监听器被复用的概率非常小,几乎可以忽略不计。一般情况下,声明的事件监听器只与某一个单独的用户界面组件事件相绑定,所以笔者在这里也建议大家使用匿名内部类来作为事件监听器。
(3)右击工程chapter7_1,在弹出的快捷菜单中选择Run As|Android Application,运行效果如图7-1所示,单击“Hello World”按钮,运行效果如图7-2所所示:

论坛徽章:
0
7 [报告]
发表于 2013-04-15 14:39 |只看该作者
7.2.2 内部类作为事件监听器类
上面章节介绍了如何使用匿名内部类来作为按钮控件的单击事件监听器类,下面通过代码方式来介绍如何使用内部类来作为按钮控件的单击事件监听器类。
(1)编辑chapter7_1工程的MainActivity.java文件,源代码如下:
public class MainActivity extends Activity
{
        TextView mTextView;//声明文本控件
        Button mMyButton;//声明按钮控件
    @Override
public void onCreate(Bundle savedInstanceState)
{
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mTextView = (TextView)findViewById(R.id.my_textview);//找到文本控件
        mMyButton = (Button)findViewById(R.id.my_button);//找到按钮控件
        mMyButton.setOnClickListener(new MyButtonClickListener());//为按钮绑定单击事件监听器
    }
    //采用内部类方式作为按钮单击事件的监听器
private final class MyButtonClickListener implements View.OnClickListener
{
            @Override
            public void onClick(View v)
{//当用户单击按钮时,触发onClick方法
                    mTextView.setText("Button has been clicked");  //设置文本内容
            }
    }   
    @Override
public boolean onCreateOptionsMenu(Menu menu)
{
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
}
采用内部类作为事件监听器有一个好处就是它的可复用性。对于上述代码当中建立的MyButtonClickListener内部类实现了View.OnClickListener这个接口,这个内部类不仅可以与id为“my_button”的按钮控件单击事件相绑定,也可以任何一个用户界面组件的单击事件相绑定。
(2)运行效果与采用匿名内部类的方式的运行效果一致。

论坛徽章:
0
8 [报告]
发表于 2013-04-15 14:39 |只看该作者
7.2.3 Activity本身作为事件监听器类
事件监听器不仅可以采用匿名内部类或者是内部类的形式,还可以使用Activity本身来作为用户界面组件的事件监听器类。
(1)编辑chapter7_1工程的MainActivity.java文件,源代码如下:
public class MainActivity extends Activity implements View.OnClickListener
{
        TextView mTextView;//声明文本控件
        Button mMyButton;//声明按钮控件
    @Override
public void onCreate(Bundle savedInstanceState)
{
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mTextView = (TextView)findViewById(R.id.my_textview);//找到文本控件
        mMyButton = (Button)findViewById(R.id.my_button);//找到按钮控件
        mMyButton.setOnClickListener(this);//采用Activity本身作为按钮单击事件监听器
    }
    @Override
public void onClick(View v)
{ //当用户单击按钮时,触发onClick方法
             mTextView.setText("Button has been clicked");  //设置文本内容
    }
    @Override
public boolean onCreateOptionsMenu(Menu menu)
{
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
}
(2)运行效果与采用匿名内部类以及内部类的方式一致。

论坛徽章:
0
9 [报告]
发表于 2013-04-15 14:41 |只看该作者
7.3  监听和处理键盘事件
接下来读者朋友将要熟悉Android应用程序当中键盘事件的监听和处理操作,主要是键盘按下(onKeyDown)事件和键盘释放(onKeyUp)事件,这些事件在游戏应用程序编写过程当中就显得比较重要。
7.3.1 监听处理onKeyDown事件
下面通过实例的方式来为读者朋友们介绍如何处理键盘按下(onKeyDown)事件。
(1)新建工程chapter7_2,编辑MainActivity.java文件,源代码如下:
public class MainActivity extends Activity
{
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {//覆盖Activity基类的键盘按下事件
            if(KeyEvent.KEYCODE_BACK == keyCode)
{//如果用户按下返回键
                    new AlertDialog.Builder(this).setTitle("确认退出吗?").setPositiveButton("确定",  new DialogInterface.OnClickListener()
{
                                @Override
                                public void onClick(DialogInterface dialog, int which)
{
                                        System.exit(0);//退出应用程序
                                }
                        }).setNegativeButton("取消", new DialogInterface.OnClickListener()
{
                                @Override
                                public void onClick(DialogInterface dialog, int which)
{
                                        dialog.dismiss();//对话框消失
                                }
                        }).show();
                    return true;//事件不再继续往下传递
            }
else if(KeyEvent.KEYCODE_SEARCH == keyCode)
{//如果用户按下搜索键
                    Toast.makeText(this, "搜索键被按下", Toast.LENGTH_LONG).show();
                    return true;
            }
else if(KeyEvent.KEYCODE_MENU == keyCode)
{//如果用户按下菜单键
                    Toast.makeText(this, "菜单键被按下", Toast.LENGTH_LONG).show();
                    return true;
            }
            return super.onKeyDown(keyCode, event);
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu)
    {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
}
在上述实例当中,笔者重写了Activity基类的onKeyDown(int keyCode, KeyEvent event)方法,当然如果为相应用户界面组件添加onKeyListener的监听器,也可以对键盘按下的事件进行监听和处理,但是如果用户界面组件没有获得用户的焦点,就不能对按下事件进行拦截和处理,所以还是重写Activity基类的onKeyDown()方法会比较好一点。

论坛徽章:
0
10 [报告]
发表于 2013-04-15 14:41 |只看该作者
onKeyDown(int keyCode, KeyEvent event)方法接收两个参数。
参数keyCode,该参数表示的是被按下的键值的键盘码,手机键盘中每个按钮都会有其单独的键盘码来作为唯一的标示,应用程序都是通过键盘码才知道用户按下的是哪个键。参数event,该参数表示的是按键事件的对象,其中包含了触发事件的详细信息,例如事件的状态、事件的类型、事件发生的时间等。当用户按下按键时,系统会自动将事件封装成KeyEvent对象供应用程序使用。
该方法的返回值为一个boolean类型的变量,当返回true时,表示已经完整地处理了这个事件,事件不再往下传递,而当返回false时,表示并没有完全处理完该事件,事件会被传递给其他的事件函数继续处理。
笔者在onKeyDown()方法当中,对用户的按键进行了判断,如果用户按下的是搜索键或者是菜单键,界面上会给出一个相应的提示,如果用户按下的是返回键,用户界面上会弹出一个对话框,对话框当中有两个按钮,当用户单击“确定”按钮的时候,应用程序会退出,当用户单击“取消”按钮的时候,弹出的对话框会消失。
(2)右击工程chapter7_2,在弹出的快捷菜单中选择Run As|Android Application命令,当用户按下返回键的时候,运行效果如图7-3所示,当用户按下搜索键的时候,运行效果如图7-4所示:
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP