美文网首页
Android 复习资料

Android 复习资料

作者: _proto_麻瓜一袁 | 来源:发表于2017-05-09 22:53 被阅读698次

    Android平台架构:

    安卓平台架构
    Applications (应用程序) -
    Applications Framework (应用程序框架) -
    Android Runtime(android 运行时) Libraries (库)
    Linux Kernel (linux内核) -
    1. 应用程序提供一组应用程序。java编写。我们再此开发

    2. 开发的程序都是基于Applications Framework,简化代码编写/提高程序复用性

    3. Libraries提供一组C/C++的库,开发人用可通过Applications Framework使用

    4. Android 运行时包括核心库和Dalvik虚拟机,核心库包含java核心库大部分功能,虚拟机负责运行程序

    5. Android采用Linux 2.6 内核提供的核心服务,包括安全性,内存管理,进程管理

    Android四大组件:

    Activity、Service、Broadcast Receiver、Content Provider

    Android项目结构:

    src包:应用程序的源代码

    gen包:包含由ADT生成的java文件(R.java AIDL文件创建的接口)【R.java也在这】

    android.jar: 包含了Android项目所需要使用的工具类

    assets包:用于保存原始资源文件,其中的文件会编译到.apk,并且原文件名会被保存(通常用于保存文本,游戏数据)

    res包:保存资源文件,当该包中文件发生变化,R文件会自动修改

    drawable:用来保存图片(有几个是因为保存高,中,低)

    layout:保存应用布局文件

    values:保存应用中使用的字符串

    AnodroidManifest.xml 文件:每个程序必须有一个,位于根目录,表明Activity,Service信息等配置信息

    project.properties文件:包含项目属性

    adb命令:

    adb devices //查询模拟器
    adb -s em-001 install test.apk //在em-001上安装test.apk
    adb install d:\test.apk  //安装d盘的test.apk
    adb push <local> <remote> //将本地文件复制到设备
    adb pull <remote> <local> //将设备文件复制到本地
    

    android 可以有多个Activity,他们组成栈,当前活动位于栈顶,之前的活动被压入栈底,成为非活动Activity

    Activity生命周期:

    Activity生命周期

    onCreate(): 创建activity时被调用

    onStart(): 启动activity时被调用,Activity变为显示时候被调用

    onRestart(): 重新启动activity时候被调用,该方法总是在onStart()之后被调用

    onPause:暂停Activity时被调用,通常涉及持久化保存数据

    onResume:当Activity从暂停变为活动时候被调用

    onStop: 停止Activity调用

    onDestory:摧毁Activity调用

    Activity中经常重写onCreate()和onPause()2个方法

    创建一个Activity类

    import android.app.Activity
    public MainActiviy extends Activity{
    
    }
    
    //我们同时也要重写onCreate方法
    @Override
    public void onCreate(Bundle savedlnstanceState){
      surper.onCreate(savedlnstanceState);
      setContentView(R.layout.main);//设置要显示的视图
    }
    

    配置Activity

    创建完成后,还要在AndroidManifest.xml中进行配置

    <application>
      <activity
        android:icon="@drawable/ic_lancher"
        android:name="DetailActivity" //name指定对应的Activity实现类
        android:label="详细"    
      >
      </activity>
    </application>
    
    

    启动/关闭Activity

    //启动
    Intent intent = new Intent(MainActivity.this,DeatilActivity.class);
    startActvity(intent)  //启动活动
    
    //关闭
    finsh() //在Activity中执行 关闭
    

    Activity中的传参问题

    使用Bundel在Activity之间交换数据:
    先将数据存入Bundel,再将Bundel存入Intent,Intent再在不同的Activity间传递。

    //Bundle 存值
    Intent intent = new Intent(MainActivity.this,DeatilActivity.class);  
    Bundle bundle = new Bundle();
    bundle.putCharSequence("name","HOUN");
    bundle.putCharSequence("pwd","123456");  
    intent.putExtras(bundle);
    startActivity(intent);
    
    //Bundle 取值
    Intent intent = getIntent();
    Bundle bundle= intent.getExtras();
    String name = bundle.getString("name");
    String pwd = bundle.getString("pwd");
    
    
    //关闭某个Activity后返回
    //打开Activity代码 替换为 startActivityForResult(intent,CODE)
    //在要返回的Activity中的finish()前加
    
      setResult(0x717,intent)
    
    //然后在第一个Activity里重写onActivityResult方法
    
    @Override
    protected void onActivityResult(int requestCode,int resultCode,Intent data){
      super.onActivityResult(requestCode,resultCode);
      if(requestCode==0x717 && resultCode==0x717){
        Bundle bundle=data.getExtras();
        /**继续你的操作*/
      }
    }
    
    

    布局管理器

    1. 线性布局

      <LinearLayout></LinearLayout> 
      

      组件按水平或垂直方向;

      android:orientation=(horizontal(水平)/ vertical(垂直,默认))

      android:gravity (布局管理器内组件的对齐方式)

    2. 表格布局

      <TableLayout>
          </TableRow></TableRow> 
      </TableLayout>
      

      </TableRow>占一行,继承线性布局

    3. 帧布局

    ```
      <FrameLayout></FrameLayout> 
    ```
     默认从左上脚(0,0)处开始,层叠排序,后面会覆盖前面的
    
    1. 相对布局
     <RelativeLayout></RelativeLayout> 
    

    线性布局

    Intent

    Intent(意图)主要是解决Android应用的各项组件之间的通讯

    实际上Activity Service Broadcast Receiver 这3个核心组件都需要Intent来激活

    Intent包含

    1. 组件名称
    2. 动作 setAction() //设置 getAction()//读取
    3. 数据
    4. 种类
    5. 额外:putExtras() 和 getExtras() 作为Bundle的设置和读取
    6. 标记
    

    Intent的两种用法:

    (1). 显式的Intent,即在构造Intent对象时就指定接收者.

    eg:

    Intent it = new Intent(Activity.Main.this, Activity2.class);
    startActivity(it);  
    

    上面那个intent中, 直接指明了接收者:Activity2

    (2).隐式的Intent,即Intent的发送者在构造Intent对象时,并不知道也不关心接收者是谁,有利于降低发送者和接收者之间的耦合,它一般用在没有明确指出目标组件名称的前提下,一般是用于在不同应用程序之间.
    eg:

    Intent it = new Intent();
    it.setAction("com.google.test");
    startActivity(it);
    

    上面那个intent, 没有指明接收者, 只是给了一个action作为接收者的过滤条件。
    对于显式Intent,Android不需要去做解析,因为目标组件已经很明确,Android需要解析的是那些隐式Intent,通过解析,将Intent映射给可以处理此Intent的Activity、IntentReceiver或Service。

    <intent-filter>  
        <action android:name="com.google.test" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter> 
    
    //android.intent.action.MAIN决定一个应用程序最先启动那个组件
    //android.intent.category.LAUNCHER决定应用程序是否显示在程序列表里(说白了就是是否在桌面上显示一个图标)
    

    注意: 每一个通过 startActivity() 方法发出的隐式 Intent 都至少有一个 category,就是 "android.intent.category.DEFAULT",所以只要是想接收一个隐式 Intent 的 Activity 都应该包括 "android.intent.category.DEFAULT" category,不然将导致 Intent 匹配失败.

    Intent的过滤器(intent-filter),按照以下优先关系查找:action->data->category

    AndroidManifest.xml

    AndroidManifest.xml文件详解

    声明程序中的Activities, ContentProviders, Services, 和Intent Receivers,还能指定permissions和instrumentation(安全控制和测试)

    <?xml version="1.0" encoding="utf-8"?>  
      
    <manifest>  
      
        <!-- 基本配置 -->  
        <uses-permission />  
        <permission />  
        <permission-tree />  
        <permission-group />  
        <instrumentation />  
        <uses-sdk />  
        <uses-configuration />  
        <uses-feature />  
        <supports-screens />  
        <compatible-screens />  
        <supports-gl-texture />  
          
        <!-- 应用配置 -->  
        <application>  
              
            <!-- Activity 配置 -->  
            <activity>  
                <intent-filter>  
                    <action />  
                    <category />  
                    <data />  
                </intent-filter>  
                <meta-data />  
            </activity>  
              
            <activity-alias>  
                <intent-filter> . . . </intent-filter>  
                <meta-data />  
            </activity-alias>  
              
            <!-- Service 配置 -->  
            <service>  
                <intent-filter> . . . </intent-filter>  
                <meta-data/>  
            </service>  
              
            <!-- Receiver 配置 -->  
            <receiver>  
                <intent-filter> . . . </intent-filter>  
                <meta-data />  
            </receiver>  
              
            <!-- Provider 配置 -->  
            <provider>  
                <grant-uri-permission />  
                <meta-data />  
            </provider>  
              
            <!-- 所需类库配置 -->  
            <uses-library />  
      
        </application>  
      
    </manifest>  
    
    
    <uses-permission> //来指定权限开发
    eg:
    <uses-permission android:name="android.permission.INTERNET"/> //开放网络
    <uses-permission android:name="android.permission.CAMERA"/> //开放照相机
    
    <permission> //权限声明标签
    
    <uses-library> //用于指定Android应用可使用的用户库
    
    <application> //应用配置的根元素,位于<manifest>下层,包含所有与应用有关配置的元素
    
    <activity> //Activity活动组件(即界面控制器组件)的声明标签,Android应用中的每一个Activity都必须在AndroidManifest.xml配置文件中声明.标签中常用的属性有:Activity对应类名android:name,对应主题android:theme,加载模式android:launchMode,另外,<activity>标签还可以包含用于消息过滤的<intent-filter>元素
    
    <intent-filter> //用于Intent消息过滤器的声明
    
    <service> //Service服务组件的声明标签
    
    <receiver> //Boardcast Receiver广播接收器组件的声明标签,用于定义与描述一个具体的Android广播接收器
    
    <provider> //Content Provider内容提供者的声明标签
    

    Content Provider

    Content Provider 用于保存和获取数据(对所有应用可见)

    一般使用ContentResolver对Content Provider进行操作

    ContentResolver cr = getContentResolver();
    

    content:// 模式表示数据由Content Provider来管理

    URI
    content:// com.test.emprovider /abc /001
    A B C D
    标准的前缀 authority部分(<provider>要声明),用于识别Content Provider Content Provider路径部分 ID值

    使用预定义的Content Provider

    ContentResolver rs = getContentResolver();
    Cursor cursor = rs.query();
    

    使用自定义的Content Provider
    首先重写6个方法

    public boolean onCreate()
    
    public Cursor query()
    
    public Uri insert()
    
    public int update()
    
    public int delete()
    
    public String getType()
    
    //声明:
    <provider
        android:name="xxxxx"
        android:authorities="xxxxxxx"
    />
    <provider>
    
    

    音频/视频

    //构造函数
    MediaPlayer player = MediaPlayer.create(this,R.raw.d);
    MediaPlayer player = MediaPlayer.create(this,Uri.parse("http://www.asd.comd/a.mp3"));
    
    //注意访问网络资源的时候 在manifest.xml中增加权限
    
    //无构造函数
    
    MediaPlayer player = new Mediaplayer();
    
    player.setDataSource("/sdcard/s.wav"); //指定要装载的音频文件
    
    player.prepare(); //预加载音频
    
    /**--------------------------------*/
    
    player.start(); //开始播放
    
    player.stop(); //停止播放
    
    player.pause(); //暂停
    
    /**--------------------------------*/
    
    //编写play方法
    
    private voidplay(){
        try{
            player.reset(); //重置MediaPlayer对象
            player.setDataSource("xxxxx");
            player.prepare();
            player.start();
        }catch(Exception e){
    
        }
    }
    
    

    SoundPool 也可以来播放音频

    VideoView 播放视频

    <VideoView>
    </VideoView>
    

    一般VideoView和MediaController 共同使用

    MediaController mc=new MediaController(MainActivity.this);
    
    video.setVideoPath("xxxx");
    video.setMediaController(mc);
    video.requestFocus();
    vidoe.start();
    vidoe.pause();
    vidoe.stop();
    
    

    MediaPlayer和SurfaceView播放视频

    <SurfaceView
        android:id="@+id/surfaceView1"
        android:keepScreenOn="true" //制定播放视频时,是否打开了屏幕
    />
    
    //播放
    
    private Mediaplayer mp;  //声明MediaPlayer
    private SurfaceView sv;  //声明SurfaceView
    
    mp=new Mediaplayer();
    sv=(SurfaceView)findViewById(R.id.surfaceView1)
    
    mp.reset();
    mp.setDataSource("xxxx");
    mp.setDisplay(sv.getHolder());
    mp.preare();
    mp.start();
    mp.stop();
    mp.pause();
    

    绘图

    Paint (画笔)

    
    Paint paint=new Paint(); //无参构造
    
    setColor(int color) color参数可以用Color类提供的常量,也可以用Color.rgb(r,g,b) //0~255
    
    setStrokeWidth(float width) //设置笔的粗细
    
    setStyle(Panit.Cap cap) //设置空心还是实心
    
    参数见下:
    
    //Paint.Style.FILL:填充内部
    
    //Paint.Style.FILL_AND_STROKE  :填充内部和描边
    
    //Paint.Style.STROKE  :描边
    

    Canvas (画布)

    Android中要绘图,首先要创建一个继承子View类的视图,然后在该类中重写onDraw(Canvas canvas)方法

    protected void onDraw(Canvas canvas){
        super.onDraw(canvas);
        Paint paint=new Paint();
        paint.setColor(Color.RED);
        canvas.drawRect(40,40,200,100,paint)
    }
    
    //canvas 提供的绘制几何图形
    canvas.drawCircle(cx,cy,radius,paint); //圆形
    canvas.drawLine(startX,startY,stopX,stopY,paint); //线
    canvas.drawPoint(x,y,paint); //点
    canvas.drawRect(left,top,right,bottom,paint); //矩形 这里的left是指左边离屏幕边界的距离
    
    

    常见UI控件

    1. 文本框:

      <TextView
          android:id="@+id/textview1"
          android:textSize="20px" //px,pt,sp,in
          android:textColor="#f00"
      >
      </TextView>
      
      TextView textView = (TextView) findViewById(R.id.textview1); 
      textView.setBackgroundResource(R.drawable.bg); //设置背景图片
      textView.setBackgroundColor(Color.RED); //设置背景颜色
      
    2. 编辑框
      EditText类是TextView类的子类

      <EditText
          android:inputType="textPassword" //限制为密码
      >
      </EditText>
      

      getText()方法可获得编辑框的值

    3. 按钮

      <Button
          android:id="@+id/button1"
          android:text="TEST"
      >
      </Button>
      
      // 1. onCreate()方法中增加监听
      
      Button b = (Button)findViewById(R.id.button1);
      b.setOnClickLinstener(new OnClickListen(){
          @Override
          public void onClick(View v){
              //code here
          }
      })
      
      // 2. xml中绑定
      
      public void myClick(View v){
          //code here
      }
      
      //然后在布局文件中 通过android:onClick="myClick"
      
      
    4. 单选/复选框

      //单选框(一般和RadioGroup一同使用)
      <RadioGroup>
          <RadioButton
              android:checked="true|false" //选中状态
          >
          </RadioButton>
      </RadioGroup>    
      
      //isChecked() 用于判断是否被选中
      
      //复选框
      <CheckBox />
      
    5. 图像视图

      <ImageView
          android:src="@drawable/flower"  //图片于drawbale中的地址
          android:scaleType="matrix|fitXY|fitStart|fitCenter|fitEnd|center|centerCrop|centerInside" 
      >
      </ImageView>
      
      //matrix方式缩放,fitXY横纵缩放,fitStart缩放左上角,fitCenter到中央,fitEnd 到右下角 
      
      // center 中央不缩放,centerCrop缩放图片完全覆盖imageview,centerInside缩放imageview能完全显示
      
      
    6. 列表视图

      <ListView
          android:id="@+id/listView1"
          android:entries="@array/ctype"
      >
      </ListView>
      
        //1. 在res\values 目录创建 arrays.xml
      
      <resources>
          <string-array name="ctype">
          <item>1</item>
          <item>2</item>
          <item>3</item>        
          </string-array>
      </resources>
      
      //2. 使用关联适配器 在onCreate()
      
      final ListView lv=(ListView)findViewById(R.id.listView1);
      
      lv.addHeaderView(line()); //设置header view
      
      ArrayAdapter<CharSequence> adapter =ArrayAdapter.createFromResource(
                this,R.array.ctype,android.R.layout.simple_list_item_check
      )
      lv.setAdapter(adapter);
      lv.addFooterView(line()); 
      

      ...后续继续更新适配器

    7. 拖动条

      <SeekBar
          android:id="@+id/sb1"
          android:progress="50"  //拖动条进度
      >
      </SeekBar>    
      
      seekbar=(SeekBar)findViewById(R.id.sb1);
      seekbar.setOnSeekBarChangeListener(new OnSeekChangeListener(){
          @Override
          public void onStopTrackingTouch(SeekBar sb){
              //stop seek
          }
          @Override
          public void onStartTrackingTouch(SeekBar sb){
              //start seek
          }
          @Override
          public void onProgressChanged(SeekBar sb,int progress,boolean fromUser){
              //change seek
          }
      })
      
      

    物理按键

     KEYCODE_POWER  //电源键
     KEYCODE_BACK //后退键
     KEYCODE_MENU //菜单
     KEYCODE_HOME  //home键
     KEYCODE_SEARCH  //查找
     KEYCODE_CAMREA //相机
     KEYCODE_DPAD_CENTER/UP/DOWN/RIGHT/CENTER //方向键
     KEYCODE_POWER_VOLMUE_UP|DOWN  //音量大小
     KEYCODE_POWER_0~9/A~Z   //0~9 A~Z
    
    

    重写一下回调方法

    onKeyUp()
    onKeyDown()
    onKeyLongPress()
    

    相关监听事件

    onClickListener()  短时间点击
    onLongClickListener() 长时间点击
    

    关于触摸:

    //实现接口  
    implements OnTouchListener(){
    }
    
    //重写 
    onTouch(){
    
    }
    

    实验

    1. 小球跟随 核心代码

    
    
    public class MainActivity extends AppCompatActivity {
    
        private float x=100;
        private float y=100;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            RelativeLayout rl=(RelativeLayout)findViewById(R.id.activity_main);
            rl.addView(new myView(this));
        }
    
    
        public class myView extends View{
            public myView(Context context){
                super(context);
            }//构造函数
    
            @Override
            protected void onDraw(Canvas canvas){
                Paint paint=new Paint();
                paint.setColor(Color.RED);
                canvas.drawCircle(x,y,50,paint);
            }
    
            @Override
            public boolean onTouchEvent(MotionEvent event){ 
                switch (event.getAction()){
                    case MotionEvent.ACTION_UP:
                    case MotionEvent.ACTION_DOWN:
                    case MotionEvent.ACTION_MOVE:
                        x=event.getX();
                        y=event.getY();
                        invalidate();
                        return true;
                }
                return super.onTouchEvent(event);
            }
        }
    }
    
    

    2. 微信登陆(Activity传值版)

    2.1 布局xml (老师的,但是布局中no与name的顺序反了) xml 大概看一哈了解一哈就行了

    <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"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context="com.example.intentdemo.MainActivity" >
    
        <TextView
            android:id="@+id/textView_no"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignLeft="@+id/editText1"
            android:layout_alignParentTop="true"
            android:layout_marginTop="75dp"
            android:text="学号" />
    
        <TextView
            android:id="@+id/textView2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_above="@+id/editText1"
            android:layout_alignLeft="@+id/editText1"
            android:text="姓名" />
    
        <EditText
            android:id="@+id/editText_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignBottom="@+id/textView_no"
            android:layout_alignParentRight="true"
            android:layout_marginRight="26dp"
            android:ems="10" />
    
        <Button
            android:id="@+id/button_logon"
            style="?android:attr/buttonStyleSmall"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/editText_name"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="56dp"
            android:text="登陆" />
    
        <EditText
            android:id="@+id/EditText_no"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignLeft="@+id/editText_name"
            android:layout_alignTop="@+id/textView2"
            android:ems="10" >
    
            <requestFocus />
        </EditText>
    
    </RelativeLayout>
    

    2.2 MainActivity (登陆 Activity相互传递)

    
    public class MainActivity extends AppCompatActivity {
        EditText _name;
        EditText _no;
        private int CODE=0X111; //自己定义的状态码 Activity回传的时候使用
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            _name=(EditText)findViewById(R.id.editText_name);
            _no=(EditText)findViewById(R.id.EditText_no);
    
            findViewById(R.id.button_logon).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    String name=_name.getText().toString();
                    String no=_no.getText().toString();
                    Intent intent=new Intent(MainActivity.this,Main2Activity.class);
    
                    //传值有2种 bundel 或者直接intent ,我这里使用的是bundle 备注的部分则是intent
                    //intent.putExtra("name",name);
                    //intent.putExtra("no",no);
    
                    Bundle bundle=new Bundle();
                    bundle.putCharSequence("name",name);
                    bundle.putCharSequence("no",no);
                    intent.putExtras(bundle);
                    startActivityForResult(intent,CODE);
                }
            });
    
        }
    
    // 自己加的 Activity回传参数执行函数的代码部分
        @Override
        protected void onActivityResult(int requestCode,int resultCode,Intent data){
            super.onActivityResult(requestCode,resultCode,data);
            if(requestCode==CODE && resultCode==CODE){
                Bundle b2=data.getExtras();
                Log.d("name",b2.getString("test"));  
            }
        }
    }
    

    2.3 Main2Activity (Activity相关回传参数的代码 )

    public class Main2Activity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main2);
    
            TextView t1=(TextView)findViewById(R.id.v1);
            TextView t2=(TextView)findViewById(R.id.v2);
    
            final Intent intent=getIntent();
            final Bundle bundle=intent.getExtras();
            t1.setText(bundle.getString("name").toString());
            t2.setText(bundle.getString("no").toString());
      // 如果使用的是intent直接传值,则用下面方法获取
      //      t1.setText(intent.getStringExtra("name"));
       //     t2.setText(intent.getStringExtra("no"));
    
    
            findViewById(R.id.back).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent t1=new Intent();
                    Bundle b2=new Bundle();
                    b2.putCharSequence("test","123131231");
                    t1.putExtras(b2);
                    setResult(0X111,t1);
                    finish();
                }
            });
    
        }
    }
    
    

    3. 微信登陆(HTTP版)

    3.1 MainActivity (登陆HTTP,老师作业的更改版(只有部分核心代码))

    
    public class MainActivity extends Activity {
    
        EditText _name;
        EditText _no;
    
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            setContentView(R.layout.activity_main);
    
    
            _name = (EditText) findViewById(R.id.editText_name);
            _no = (EditText) findViewById(R.id.EditText_no);
    
            findViewById(R.id.button_logon).setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    
                    String nameString = _name.getText().toString();
                    String noString = _no.getText().toString();
                    String content = "username=" + nameString + "&no=" + noString;
                    MyNetClient mn = new MyNetClient();
                    try {
                        String result = "";
                        result = mn.HttpPost("http://47.93.13.69/login/login.php", content);
                        if (!result.equals("")) {  //这里是判断是我自己随便加的,获取到result具体如何判断应该根据实际条件来
                            Intent intent = new Intent(MainActivity.this, Act1.class);
                            startActivity(intent);
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            });
        }
    }
    

    3.2 上文用到的老师写MyNetClient 的HttpPost方法

        //普通post提交
        //url   提交的页面
        //content  提交的数据,格式:name1=value1&name2=value2...
        public static String HttpPost(String url, String content) throws IOException {
                HttpURLConnection conn = null;
      
                // 创建一个URL对象
                URL mURL = new URL(url);
                // 调用URL的openConnection()方法,获取HttpURLConnection对象
                conn = (HttpURLConnection) mURL.openConnection();
    
                conn.setRequestMethod("POST");// 设置请求方法为post
                conn.setDoOutput(true);// 设置此方法,允许向服务器输出内容
                conn.setDoInput(true);
                conn.setUseCaches(false);
                
                conn.connect(); //打开连接
                
                // post请求的参数
                String data = content;
                // 获得一个输出流,向服务器写数据,默认情况下,系统不允许向服务器输出内容
                OutputStream out = conn.getOutputStream();// 获得一个输出流,向服务器写数据
                
                out.write(data.getBytes());
                out.flush();
                out.close();
    
                String responseCookie = conn.getHeaderField("Set-Cookie");
                if (responseCookie != null) {
                    Log.i("demo", responseCookie);
                }
                int responseCode = conn.getResponseCode();// 调用此方法就不必再使用conn.connect()方法
                if (responseCode == 200) {
    
                    InputStream is = conn.getInputStream();
                    InputStreamReader isr = new InputStreamReader(is, "utf-8");
                    BufferedReader br = new BufferedReader(isr);
                    String result = br.readLine();
                    return result;
                } 
            
            return null;
        }
    

    临时抱佛脚的复习资料,可能存在一些问题。如有问题,请在评论区指出,谢谢。

    相关文章

      网友评论

          本文标题:Android 复习资料

          本文链接:https://www.haomeiwen.com/subject/bdaitxtx.html