Android总结五(网络编程、Activity)

一.网络编程

  1.发送GET请求

    AsyncHttpClient.get(), 使用RequestParams传递数据

  2.发送POST请求

    AsyncHttpClient.post(), 使用RequestParams传递数据

  3.访问Webservice

    Webservice就是别人写好的, 已经发布在网络上的公开的API, 应用程序中可以直接调用

  4.上传

    在RequestParams中添加一个File类型的字段, AsyncHttpClient就会执行上传操作

  5.下载

    请求下载路径, 使用FileAsyncHttpResponseHandler来处理下载文件

二.Activity

  1.什么是Activity

    安卓四大组件之一, 用来显示界面, 一个Activity就是应用中一个界面

  2.创建

    定义类继承Activity

    清单文件中声明<activity>节点

  3.启动

    创建Intent对象, Intent指定要启动哪个Activity, startActivity()

    a.显式意图: 

      指定类名, 通常用作应用程序内部跳转

      通过构造函数, 或者setClass(), setClassName()方法可以指定类名

      startActivity()启动一个Activity

      如果启动其他应用程序中的Activity, 该Activity的export属性必须为true

    b.隐式意图: 

      不指定类名, 通常用在应用程序之间跳转

      通过Intent.setAction()和Intent.setData()来设置意图的动作和数据

      Activity中的<intent-filter>如果能匹配上动作和数据就可以启动

  4.关闭:调用Activity的finish()方法即可关闭activity

    1)关闭主界面时弹出提示对话框:

      (1)重写父类的finish()方法;

      (2)设置弹出对话框。

    2)关闭主界面时显示“再按一次退出XXXX”提示:

      (1)重写父类的finish()方法;

      (2)记录当前退出时间,计算按两次退出按钮的时间差。

    3)代码:

关闭主界面时弹出提示对话框的代码:

@Override
    public void finish() {// 重写finish()方法,实现退出时弹出对话框提示
        new AlertDialog.Builder(this).setTitle("确定要退出吗?").setPositiveButton("确定", new OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {
                MainActivity.super.finish();
            }
        }).setNegativeButton("取消", null).show();
    }

关闭主界面时显示“再按一次退出XXXX”提示的代码:

@Override
    public void finish() {// 重写finish()方法,实现退出时弹出“再按一次退出XXXX”提示    
        if (System.currentTimeMillis() - previous < 1000) {
            super.finish();
        } else {
            previous = System.currentTimeMillis();
            Toast.makeText(getApplicationContext(), "再按一次退出XXXX", Toast.LENGTH_SHORT).show();
        }
    }

   5.传递数据

    a.启动时传递数据

      Intent可以使用putExtra()方法装入数据(键值对)

      新Activity中getIntent()之后, 可以调用getStringExtra(), getIntExt(),...获取数据

      可传递数据类型: 基本数据类型, String, Bundle, Serializable, Parcelable

传递代码:


Intent intent = new Intent(this, OtherActivity.class);

        /*
        // 传递基本数据
        intent.putExtra("name", "张三");
        intent.putExtra("age", 18);
        */
        
        /*
        //传递自定义类数据,自定义类必须实现Serializable接口
        Person p=new Person("李四",12);
        intent.putExtra("p", p);
        */
        
        /*
        //传递Bundle(Map集合)数据
        Bundle bundle=new Bundle();
        bundle.putString("name", "张三");
        bundle.putInt("age", 12);
        intent.putExtra("bundle", bundle);
        */
        
        //传递Parcelable,自定义类必须实现Parcelable接口
        Person p=new Person("玩玩", 11);
        intent.putExtra("p", p);
        
        startActivity(intent);

接收数据代码:

Intent intent = getIntent();
        
        /*
        // 接收基本数据        
        String name = intent.getStringExtra("name");
        int age = intent.getIntExtra("age", -1);
        */
        
        /*
        //接收自定义类数据
        Person p= (Person) intent.getSerializableExtra("p");
        */
        
        /*
        //接收Bundle数据
        Bundle bundle= intent.getBundleExtra("bundle");
        */
        
        //接收Parcelable数据
        Person p= intent.getParcelableExtra("p");

        tv.setText(p.getName() + "," + p.getAge());

实现Parcelable接口的Person类:

package com.gnnuit.activity;

import android.os.Parcel;
import android.os.Parcelable;

public class Person implements Parcelable {

    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Person(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }

    public Person() {

    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel parcel, int flags) {// 定义怎样把数据写到Parcel中
        parcel.writeString(name);
        parcel.writeInt(age);
    }

    public static final Parcelable.Creator<Person> CREATOR = new Parcelable.Creator<Person>() {
        public Person createFromParcel(Parcel parcel) {// 定义怎样从Parcel中取出数据
            return new Person(parcel.readString(), parcel.readInt());
        }

        public Person[] newArray(int size) {
            return new Person[size];
        }
    };

}

     b.关闭时返回数据

      如果希望新的Activity可以返回数据, 那么就需要使用startActivityForResult()方法来启动Activity

      在新的Activity中调用setReuslt()方法设置要返回的数据

      finish()之后, 原Activity会自动调用onActivityResult(), 该方法的形参就是setReuslt()设置的数据

   6.生命周期

  7.横竖屏切换

    a.默认情况下, 横竖屏切换时会摧毁Activity重构, 因为要进行屏幕适配. 

      可以使用onSaveInstanceState()保存数据, 用onRestoreInstanceState()恢复数据

      onSaveInstanceState()在Activity失去焦点时也会被调用, 如果Activity在后台被杀死了, 再次启动时会自动调用onRestoreInstanceState()

    b.如果不需要屏幕适配, 那么可以通过定义属性控制Activity不摧毁重构

      android:configChanges="orientation|screenSize"

      这种情况下不执行任何生命周期方法, 也不会改变布局

    c.固定Activity方向

      android:screenOrientation="portrait"

      在这种情况下, Activity不会摧毁重构, 也不会改变方向

    d.相关代码

      getResources().getConfiguration().orientation

      setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)

      setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)

  8.启动模式

    a.standard: 每次都启动一个新的

    b.singleTop: 不能自己创建自己

    c.singleTask: 启动哪个, 就把它上面的出栈

    d.singleInstance: 启动哪个就把哪个放在栈顶

原文地址:https://www.cnblogs.com/FlySheep/p/3843387.html