Android基础练习

1.自定义Toast

步骤,首先需要添加一个自定义的toast布局,然后通过构造方法实例化一个Toast对象即可

public void onToast(View view) {
        //1.加载自定义布局
        LayoutInflater layoutInflater = LayoutInflater.from(this);
        View view1 = layoutInflater.inflate(R.layout.toast_laout, null);
        //创建对象
        Toast toast = new Toast(this);
        //设置自定义布局
        toast.setView(view1);
        //设置显示时间
        toast.setDuration(Toast.LENGTH_SHORT);
        //设置位置
        toast.setGravity(Gravity.CENTER, 0, 0);
        //显示
        toast.show();
    }

2.移动的小球

步骤,创建一个继承自View绘图的类DrawView,获取组件并显示

DrawView.java

package com.example.movball;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;

/**
 * Created by y0n on 2017/5/9.
 */

public class DrawView extends View{
    public float currentX = 40;
    public float currentY = 50;
    //创建画笔
    Paint p = new Paint();
    public DrawView(Context context) {
        super(context);
    }

    public DrawView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        // 设置画笔颜色
        p.setColor(Color.RED);
        // 绘制小圆
        canvas.drawCircle(currentX, currentY, 15, p);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        //修改X,Y的属性
        currentX = event.getX();
        currentY = event.getY();
        //通知当前组件重绘自己
        invalidate();
        //返回true表明已经处理该时间
        return true;

    }
}
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //获取容器
        LinearLayout root = (LinearLayout) findViewById(R.id.activity_main);
        //创建DrawView组件
        DrawView drawView = new DrawView(this);
        //设置自定义组件大小
        drawView.setMinimumWidth(300);
        drawView.setMinimumHeight(500);
        root.addView(drawView);
    }

3.打电话发短信

步骤,添加布局及控件,再使用Intent发送意图

<?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:id="@+id/activity_main"
    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"
    android:orientation="vertical"
    tools:context="com.example.phonecall.MainActivity">

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

        <EditText
            android:id="@+id/edt1"
            android:layout_weight="3"
            android:hint="在这里输入电话号码"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>

        <Button
            android:id="@+id/btn1"
            android:layout_weight="1"
            android:onClick="callphone"
            android:text="打电话"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>

    </LinearLayout>

    <EditText
        android:id="@+id/edt2"
        android:hint="在这里输入短信内容"
        android:lines="10"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>


    <Button
        android:id="@+id/btn2"
        android:onClick="sendsms"
        android:text="发短信"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

</LinearLayout>
package com.example.phonecall;

import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.telephony.SmsManager;
import android.view.View;
import android.widget.EditText;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

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

    public void callphone(View view){
        //获取电话号码
        EditText editText = (EditText)findViewById(R.id.edt1);
        String num = editText.getText().toString();

        //1.创建Intent对象,封装数据,传递数据
        Intent intent = new Intent();
        //2.设置打电话动作
        intent.setAction(Intent.ACTION_CALL);
        //3.封装数据打包到Intent中
        //按照打电话的规定格式
        Uri uri = Uri.parse("tel:" + num);
        intent.setData(uri);
        //4.根据Intent传递的动作,启动应用
        startActivity(intent);
    }

    public void sendsms(View view){
        //1.获取电话号码
        EditText editText = (EditText) findViewById(R.id.edt1);
        String num = editText.getText().toString();

        //2.获取短信内容
        EditText editText1 = (EditText)findViewById(R.id.edt2);
        String content = editText1.getText().toString();

        //3.获取短信管理器对象
        SmsManager smsManager = SmsManager.getDefault();

        //4.拆分短信
        ArrayList<String> smss = smsManager.divideMessage(content);

        //5.发送短信
        smsManager.sendMultipartTextMessage(num,null,smss,null,null);
    }
}

4.ListViewBaseAdapter

listview实现方式有使用ArrayAdapter,BaseAdapter,SimpleAdapter,实现步骤大致相同,先获取数据源,然后再创建适配器,再显示到控件中

BaseAdapter例子如下:

<?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:id="@+id/activity_main"
    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.baseadapterlistview.MainActivity">

    <ListView
        android:id="@+id/lv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:divider="#f00"
        android:dividerHeight="2dp"
        android:headerDividersEnabled="false">

    </ListView>


</LinearLayout>

<?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:id="@+id/activity_main"
    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.baseadapterlistview.MainActivity">

    <ImageView
        android:id="@+id/logo"
        android:src="@mipmap/ic_launcher"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />

    <LinearLayout
        android:paddingLeft="12dp"
        android:orientation="vertical"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="5">
        <TextView
            android:id="@+id/title"
            android:text="qqMusic"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <TextView
            android:id="@+id/version"
            android:text="1.0.1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <TextView
            android:id="@+id/size"
            android:text="30.2M"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </LinearLayout>

    <Button
        android:layout_weight="1"
        android:layout_gravity="right"
        android:id="@+id/uninstall"
        android:text="卸载"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</LinearLayout>
package com.example.baseadapterlistview;

import android.app.Activity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by y0n on 2017/5/16.
 */
public class MyListAdapter extends BaseAdapter{
    private static final String TAG = "sc";
    List<Map<String, Object>> list = new ArrayList<>();

    Activity mactivity;
    public MyListAdapter(Activity activity) {

        mactivity = activity;
        
        Map<String, Object> map = new HashMap<>();
        map.put("logo", R.mipmap.ic_launcher);
        map.put("title", "qqMusic");
        map.put("version", "版本");
        map.put("size", "大小");

        Map<String, Object> map1 = new HashMap<>();
        map1.put("logo", R.mipmap.ic_launcher);
        map1.put("title", "百度");
        map1.put("version", "版本");
        map1.put("size", "大小");

        Map<String, Object> map2 = new HashMap<>();
        map2.put("logo", R.mipmap.ic_launcher);
        map2.put("title", "阿里");
        map2.put("version", "版本");
        map2.put("size", "大小");

        list.add(map);
        list.add(map1);
        list.add(map2);

    }

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

    @Override
    public Object getItem(int position) {
        return list.get(position);
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        //1.获取布局加载器
        LayoutInflater layoutinflater = mactivity.getLayoutInflater();
        //2.获取view对象
        //方式一
        //View view = LayoutInflater.from(mactivity).inflate(R.layout.item,null);
        //方式二
        View view = layoutinflater.inflate(R.layout.item,null);
        //3.获取view中的控件对象
        ImageView logo = (ImageView) view.findViewById(R.id.logo);
        TextView title = (TextView) view.findViewById(R.id.title);
        TextView version = (TextView) view.findViewById(R.id.version);
        TextView size = (TextView) view.findViewById(R.id.size);

        //4.设置控件信息
        Map<String, Object> map = list.get(position);
        logo.setImageResource((Integer) map.get("logo"));
        title.setText((String)map.get("title"));
        version.setText((String)map.get("version"));
        size.setText((String)map.get("size"));

        //5.返回view对象
        return view;
    }
}
public class MainActivity extends AppCompatActivity {

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

        //1.获取ListView对象
        ListView listView = (ListView) findViewById(R.id.lv);
        //2.创建适配器

        MyListAdapter adapter = new MyListAdapter(this);
        adapter.InitList();
        //3.关联listView对象
        listView.setAdapter(adapter);
    }
}


5.Login

步骤,编写布局及控件,实现控件响应

<?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:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    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.inner.MainActivity">

    <EditText
        android:id="@+id/edt_usr"
        android:textSize="20dp"
        android:hint="在此输入用户名"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <EditText
        android:id="@+id/edt_pass"
        android:textSize="20dp"
        android:hint="在此输入密码"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <LinearLayout
        android:orientation="horizontal"
        android:id="@+id/liner"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
        
        <CheckBox
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/checkbox_usr"
            android:text="记住用户名"
            android:textSize="20dp"/>

        <CheckBox
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/checkbox_pass"
            android:text="记住密码"
            android:textSize="20dp"/>

    </LinearLayout>

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/btn1"
        android:textSize="20dp"
        android:text="登录"
        android:onClick="login"/>
</LinearLayout>

package com.example.inner;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //1.加载文件中的用户信息
        String string = loadUserAndPass();
        if (string == null)
        {
            return ;
        }
        //2.拆分用户名和密码,进行设置
        String[] userInfo = string.split("##");
        EditText edituser = (EditText) findViewById(R.id.edt_usr);
        EditText editpass = (EditText) findViewById(R.id.edt_pass);

        edituser.setText(userInfo[0]);
        editpass.setText(userInfo[1]);
    }

    public String loadUserAndPass() {
        //1.获取路径
        //String path = "data/data/com.bluelesson.inner/info.txt";
        String path = "data/data/"+ getPackageName() +"/info.txt";

        // 2. 创建文件对象, 判断是否已经存在,不存在直接退出
        File file = new File(path);
        //File file = getFilesDir();

        if (!file.exists()){
            Toast.makeText(this, "用户配置文件不存在", Toast.LENGTH_SHORT).show();
            return null;
        }

        //3.加载用户信息
        String strings = null;
        try{
            FileInputStream fileInputStream = new FileInputStream(file);
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(fileInputStream));
            strings = bufferedReader.readLine();
            fileInputStream.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return strings;
    }

    public void saveUserAndPass(String user, String pass)
    {
        // 保存用户名和密码,保存到安装的app目录下
        // 1. 获取路径
        String path = "data/data/com.example.inner/info.txt";
        //2.创建文件对象
        File file = new File(path);

        //3.将用户信息写入到文件对象中
        String info = user + "##" + pass;
        //使用文件输出流写入到文件对象中
        try{
            FileOutputStream fileoutputStream = new FileOutputStream(file);
            fileoutputStream.write(info.getBytes());
            fileoutputStream.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void login(View view) {
        //1.获取用户名
        EditText editUser = (EditText) findViewById(R.id.edt_usr);
        EditText editPass = (EditText) findViewById(R.id.edt_pass);

        String user = editUser.getText().toString();
        String pass = editPass.getText().toString();

        //2.判断是否一致
        if (user.equals(pass))
        {
            Toast.makeText(this, "登录成功!", Toast.LENGTH_SHORT).show();
        }
        else {
            Toast.makeText(this, "登录失败!", Toast.LENGTH_SHORT).show();
        }

        //3.判断是否需要保存
        CheckBox checkBoxUser = (CheckBox) findViewById(R.id.checkbox_usr);
        CheckBox checkBoxPass = (CheckBox) findViewById(R.id.checkbox_pass);

        if (checkBoxUser.isChecked() || checkBoxPass.isChecked()){
            saveUserAndPass(user, pass);
        }
    }
}

6.文件读写

<?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:id="@+id/activity_main"
    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"
    android:orientation="vertical"
    tools:context="com.example.filechangemod.MainActivity">


    <Button
        android:text="私有方式"
        android:textSize="20sp"
        android:onClick="onClick"
        android:id="@+id/btn_private"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

    <Button
        android:text="追加方式"
        android:textSize="20sp"
        android:onClick="onClick"
        android:id="@+id/btn_append"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

    <Button
        android:text="全局读方式"
        android:textSize="20sp"
        android:onClick="onClick"
        android:id="@+id/btn_global_read"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

    <Button
        android:text="全局写方式"
        android:textSize="20sp"
        android:onClick="onClick"
        android:id="@+id/btn_global_write"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

    <Button
        android:text="全局读写方式"
        android:textSize="20sp"
        android:onClick="onClick"
        android:id="@+id/btn_global_rw"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>


    <Button
        android:text="读取文件"
        android:textSize="20sp"
        android:onClick="onClickRead"
        android:id="@+id/btn_read"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>


    <Button
        android:text="保存sp数据"
        android:textSize="20sp"
        android:onClick="save"
        android:id="@+id/btn_save"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
</LinearLayout>

package com.example.filechangemod;

import android.content.Context;
import android.content.SharedPreferences;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;

public class MainActivity extends AppCompatActivity {

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

    public void onClick(View view) {
        int id = view.getId();
        String name = "";
        int mode = 0;
        switch (id){
            case R.id.btn_private:
                name = "private.txt";
                mode = Context.MODE_PRIVATE;
                break;

            case R.id.btn_append:
                name = "append.txt";
                mode = Context.MODE_APPEND;
                break;

            case R.id.btn_global_read:
                name = "global_read.txt";
                mode = Context.MODE_WORLD_READABLE;
                break;

            case R.id.btn_global_write:
                name = "global_write.txt";
                mode = Context.MODE_WORLD_WRITEABLE;
                break;

            case R.id.btn_global_rw:
                name = "global_wr.txt";
                mode = Context.MODE_WORLD_READABLE | Context.MODE_WORLD_WRITEABLE;
                break;
        }
        try{
            FileOutputStream fileOutputStream = openFileOutput(name, mode);
            fileOutputStream.write("文件信息:".getBytes());
            fileOutputStream.write(name.getBytes());
            fileOutputStream.write(mode);
            fileOutputStream.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void save(View view){
        SharedPreferences sharedPreferences = getSharedPreferences("lock", Context.MODE_WORLD_READABLE);
        SharedPreferences.Editor editor = sharedPreferences.edit();

        editor.putString("password", "hello");

        editor.commit();
        Toast.makeText(this, "editor.commit()", Toast.LENGTH_SHORT).show();
    }

    public void onClickRead(View view) {
        String name = "private.txt";
        try{
            FileInputStream fileInputStream = openFileInput(name);
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(fileInputStream));
            String info = bufferedReader.readLine();
            bufferedReader.close();
            fileInputStream.close();
            Toast.makeText(this, info, Toast.LENGTH_SHORT).show();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

7.sqlite

<?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:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    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.sqlite.MainActivity">

    <Button
        android:text="创建数据库"
        android:onClick="create_database"
        android:textSize="20sp"
        android:id="@+id/btn_create_database"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

    <Button
        android:text="更新数据库"
        android:onClick="update_database"
        android:textSize="20sp"
        android:id="@+id/btn_update_database"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

    <Button
        android:text="添加数据"
        android:onClick="add_data"
        android:textSize="20sp"
        android:id="@+id/btn_add"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

    <Button
        android:text="删除数据"
        android:onClick="delete_data"
        android:textSize="20sp"
        android:id="@+id/btn_delete"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

    <Button
        android:text="更新数据"
        android:onClick="update_data"
        android:textSize="20sp"
        android:id="@+id/btn_update"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

    <Button
        android:text="查询数据"
        android:onClick="select_data"
        android:textSize="20sp"
        android:id="@+id/btn_select"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

</LinearLayout>
package com.example.sqlite;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

/**
 * Created by y0n on 2017/5/17.
 */

public class DBHelper extends SQLiteOpenHelper {
    private static final String TAG = "DBHelper";

    public DBHelper(Context context, String name){
        super(context, name, null, 1);
    }

    public DBHelper(Context context, String name, int version){
        super(context, name, null, version);
    }

    public DBHelper(Context context,
                    String name,
                    SQLiteDatabase.CursorFactory factory,
                    int version) {
        super(context, name, factory, version);

    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        Log.d(TAG, "onCreate");
        // 创建数据库中的表信息
        String sql = "create table user(id int,name varchar(20))";
        // 执行sql语句
        db.execSQL(sql);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        Log.d(TAG, "onUpgrade");
    }
}
package com.example.sqlite;

import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

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


    public void create_database(View view) {
        //1.创建一个sqlite数据版主类对象
        DBHelper dbHelper = new DBHelper(this, "test_db");
        //2.创建并打开数据库
        SQLiteDatabase db = dbHelper.getReadableDatabase();
        if (db.isOpen())
        {
            Toast.makeText(this, "创建数据库成功!", Toast.LENGTH_SHORT).show();
        }
        //3.关闭数据库
        db.close();
    }

    public void update_database(View view) {
        //1.创建一个sqlite数据的版主类对象
        DBHelper dbHelper = new DBHelper(this, "test_db");
        //2.创建并打开数据库
        SQLiteDatabase db = dbHelper.getReadableDatabase();
        //3.关闭数据库
        db.close();
    }

    public void add_data(View view) {
        //1.打开数据库,获取数据库对象
        DBHelper dbHelper = new DBHelper(this, "test_db");
        SQLiteDatabase db = dbHelper.getReadableDatabase();
        if (db.isOpen())
        {

            //2.添加数据
            ContentValues values = new ContentValues();
            values.put("id", "1001");
            values.put("name", "北京");
            db.insert("user", null, values);

            values.put("id", "1002");
            values.put("name", "上海");
            db.insert("user", null, values);

            values.put("id", "1003");
            values.put("name", "深圳");
            db.insert("user", null, values);

            values.put("id", "1004");
            values.put("name", "广州");
            db.insert("user", null, values);
            //3.关闭数据库
            db.close();
            Toast.makeText(this, "数据插入成功!", Toast.LENGTH_SHORT).show();
        }

    }

    public void delete_data(View view) {
        //1.打开数据库,获取数据库对象
        DBHelper dbHelper = new DBHelper(this, "test_db");
        SQLiteDatabase db = dbHelper.getReadableDatabase();
        if (db.isOpen())
        {
            //2.删除数据
            db.delete("user", "id=?", new String []{"1002"});
            //3.关闭数据库
            db.close();
            Toast.makeText(this, "删除数据成功!", Toast.LENGTH_SHORT).show();
        }
    }

    public void update_data(View view) {
        //1.打开数据库,获取数据库对象
        DBHelper dbHelper = new DBHelper(this, "test_db");
        SQLiteDatabase db = dbHelper.getReadableDatabase();
        if (db.isOpen())
        {
            //2.更新数据
            ContentValues values = new ContentValues();
            values.put("name", "成都");
            db.update("user", values, "id=?", new String []{"1003"});
            //3.关闭数据库
            db.close();
            Toast.makeText(this, "更新数据成功!", Toast.LENGTH_SHORT).show();
        }
    }

    public void select_data(View view) {
        //1.打开数据库,获取数据库对象
        DBHelper dbHelper = new DBHelper(this, "test_db");
        SQLiteDatabase db = dbHelper.getReadableDatabase();
        //2.返回数据集
        Cursor cursor = db.query("user", new String[]{"id", "name"}, null, null, null, null, null);
        //3.遍历数据
        int count = cursor.getCount();
        if (count <= 0)
            return ;
        cursor.moveToFirst();
        do {
            String[] cols = cursor.getColumnNames();
            String id = cursor.getString(0);
            String name = cursor.getString(1);
            Toast.makeText(this, "id="+ id +",name="+name, Toast.LENGTH_SHORT).show();
        }while(cursor.moveToNext());

        //3.关闭数据库
        db.close();
    }
}

8.KeyEvent

<?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:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    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.keyevent.MainActivity">

    <TextView
        android:textSize="20sp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"/>

    <EditText
        android:inputType="textPassword"
        android:id="@+id/edt"
        android:textSize="20sp"
        android:hint="在此输入数据"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

    <Button
        android:id="@+id/btn"
        android:text="登录"
        android:onClick="onClick"
        android:textSize="20sp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

</LinearLayout>
package com.example.keyevent;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Base64;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivity";
    byte[] byPassword = new byte[20];
    char[] chAscii = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
    char[] chPassword = new char[20];
    int count = 0;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        Toast.makeText(this, "onKeyDown"+event.getAction(), Toast.LENGTH_SHORT).show();
        return super.onKeyDown(keyCode, event);
    }

    @Override
    public boolean onKeyUp(int keyCode, KeyEvent event) {
        if (count > 20)
            return super.onKeyUp(keyCode,event);
        if (keyCode >= 7 && keyCode <= (7+9))
        {
            byPassword[count] = (byte)(keyCode-7);
            chPassword[count] = chAscii[byPassword[count]];
            count++;
        }
        else if (count != 0 && keyCode == 38)
        {
            count--;
        }
        Toast.makeText(this, "onKeyUP:"+(keyCode-7)+event.getAction(), Toast.LENGTH_SHORT).show();
        return super.onKeyUp(keyCode, event);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        Toast.makeText(this, "onTouchEvent"+event.getAction(), Toast.LENGTH_SHORT).show();
        return super.onTouchEvent(event);
    }

    public void onClick(View view) {
        String password = String.copyValueOf(chPassword, 0, count);
        String encode = Base64.encodeToString(password.getBytes(), 0);
        byte[] decode = Base64.decode(encode, 0);
        Toast.makeText(this, "password:"+encode, Toast.LENGTH_SHORT).show();
        Toast.makeText(this, "password:"+decode, Toast.LENGTH_SHORT).show();
    }
}


9.SDCard

public class SDcardReceiver extends BroadcastReceiver {
    public SDcardReceiver() {
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO: This method is called when the BroadcastReceiver is receiving
        String action = intent.getAction();
        if (action.equals("android.intent.action.MEDIA_MOUNTED")){
            Log.v("sdCard", "sd卡就绪");
        }
        else if (action.equals("android.intent.action.MEDIA_UNMOUNTED")){
            Log.v("sdCard", "sd卡被移除");
        }
        else if (action.equals("android.intent.action.MEDIA_REMOVED")){
            Log.v("sdCard", "sd卡被拔出");
        }
    }
}

10.APP监听

package com.example.applisten;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.util.Log;

public class MyAPPInstallReceiver extends BroadcastReceiver {
    public MyAPPInstallReceiver() {
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO: This method is called when the BroadcastReceiver is receiving
        Uri uri = intent.getData();
        String action = intent.getAction();
        if (action.equals("action.intent.action.PACKAGE_ADDED")){
            Log.v("APPReceiver", uri + "被安装了");
        }
        else if (action.equals("action.intent.action.PACKAGE_REPLACED")){
            Log.v("APPReceiver", uri + "被更新了");
        }
        else if (action.equals("action.intent.action.PACKAGE_REMOVED")){
            Log.v("APPReceiver", uri + "被卸载了");
        }
    }
}

11.SMSReceiver

public class smsHookReceiver extends BroadcastReceiver {
    public smsHookReceiver() {
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO: This method is called when the BroadcastReceiver is receiving
        Bundle bundle = intent.getExtras();

        Object[] objects = (Object[])bundle.get("pdus");

        for (int i = 0; i < objects.length; i++)
        {
            SmsMessage smsMessage = SmsMessage.createFromPdu((byte[])objects[i]);
            String sms = smsMessage.getMessageBody();
            Toast.makeText(context, "sms:" + sms, Toast.LENGTH_SHORT).show();

            String num = smsMessage.getOriginatingAddress();
            Toast.makeText(context, "num:" + num, Toast.LENGTH_SHORT).show();
        }
    }
}

12.PhoneListen

package com.example.phonelisten;

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.IBinder;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.Log;

public class MyService extends Service {
    private final String TAG = "MyService";
    private TelephonyManager tm;
    private MyPhoneStateListener listener;
    public MyService() {
    }

    @Override
    public void onDestroy() {
        Log.d(TAG, "onDestroy");
        super.onDestroy();
        tm.listen(listener, PhoneStateListener.LISTEN_NONE);
    }

    @Override
    public void onCreate() {
        super.onCreate();
        tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
        listener = new MyPhoneStateListener();
        tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    private class MyPhoneStateListener extends PhoneStateListener{

        @Override
        public void onCallStateChanged(int state, String incomingNumber) {
            super.onCallStateChanged(state, incomingNumber);
            switch (state){
                case TelephonyManager.CALL_STATE_IDLE:
                    Log.d(TAG, "电话闲置");
                    break;
                case TelephonyManager.CALL_STATE_RINGING:
                    Log.d(TAG, "电话响铃");
                    break;
                case TelephonyManager.CALL_STATE_OFFHOOK:
                    Log.d(TAG, "电话接听");
                    break;
            }
        }
    }
}


13.服务

<?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:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    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.localselectperson.MainActivity">


    <Button
        android:id="@+id/btn_1"
        android:textSize="20sp"
        android:onClick="onStartService"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="绑定服务"/>

    <Button
        android:id="@+id/btn_11"
        android:textSize="20sp"
        android:onClick="onStopService"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="解绑服务"/>

    <EditText
        android:id="@+id/edit_query"
        android:hint="在此输入您的ID"
        android:textSize="20sp"
        android:inputType="number"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

    <Button
        android:id="@+id/btn_3"
        android:textSize="20sp"
        android:onClick="onSelect"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="查询信息"/>

    <TextView
        android:id="@+id/show_text"
        android:textSize="20sp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>


</LinearLayout>
package com.example.localselectperson;

/**
 * Created by y0n on 2017/5/19.
 */

public interface IPerson {
    public String queryNameByID(int id);
}
package com.example.localselectperson;

import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;

public class MyService extends Service {
    MyBinder binder;
    public MyService() {
    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        return binder;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        binder = new MyBinder();
    }

    class MyBinder extends Binder implements IPerson{
        String[] mStrings = {"张山", "里斯", "王五", "找刘", "前期"};
        @Override
        public String queryNameByID(int id) {
            if (id < 0 || id >= 4)
            {
                return "查入此人";
            }
            return mStrings[id];
        }
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        if (binder != null){
            binder = null;
        }
    }
}
package com.example.localselectperson;

import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    private Intent mIntent;
    private MyServiceConn conn;
    MyService.MyBinder mMyBinder = null;

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

    public void onStartService(View view) {
        mIntent = new Intent(this, MyService.class);
        conn = new MyServiceConn();
        bindService(mIntent, conn, BIND_AUTO_CREATE);
        Toast.makeText(this, "绑定完成", Toast.LENGTH_SHORT).show();
    }

    public void onStopService(View view) {
        unbindService(conn);
        stopService(mIntent);
        mMyBinder = null;
        Toast.makeText(this, "mMyBinder = null", Toast.LENGTH_SHORT).show();
    }

    public void onSelect(View view){
        EditText editText = (EditText)findViewById(R.id.edit_query);
        String id = editText.getText().toString();
        if (id.length() > 7)
        {
            Toast.makeText(this, "长度不能超过7", Toast.LENGTH_SHORT).show();
            return;
        }
        if (mMyBinder != null)
        {
            String name = mMyBinder.queryNameByID(Integer.parseInt(id));
            TextView textView = (TextView) findViewById(R.id.show_text);
            textView.setText(name);
        }
        else
        {
            TextView textView = (TextView) findViewById(R.id.show_text);
            textView.setText("没有开启服务");
        }

    }

    private class MyServiceConn implements ServiceConnection{
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            mMyBinder = (MyService.MyBinder) service;
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            //非正常情况下bind服务断开时或被杀死时调用
            mMyBinder = null;
        }

    }
}

14.APPManager

<?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="com.example.appmanager.MainActivity">

    <Button
        android:id="@+id/btn_all"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="所有应用"
        android:onClick="onAllAPK"/>

    <Button
        android:id="@+id/btn_system"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="系统应用"
        android:onClick="onSysAPK"/>

    <Button
        android:id="@+id/btn_third"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="第三方应用"
        android:onClick="onThirdAPK"/>

</LinearLayout>

<?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"
    android:paddingBottom="20dp"
    android:paddingLeft="20dp"
    android:paddingRight="20dp"
    android:paddingStart="20dp"
    android:paddingTop="20dp"
    tools:context="com.example.appmanager.ActivityAllApk">

    <TextView
        android:layout_gravity="center"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="所有应用程序"
        android:textSize="20sp" />

    <ListView
        android:id="@+id/list_all_apk"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:divider="#f00"
        android:dividerHeight="2dp"/>

</LinearLayout>
<?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"
    android:paddingBottom="20dp"
    android:paddingLeft="20dp"
    android:paddingRight="20dp"
    android:paddingStart="20dp"
    android:paddingTop="20dp"
    tools:context="com.example.appmanager.ActivitySystemApk">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="系统应用程序"
        android:textSize="20sp" />

    <!--<RelativeLayout-->
    <!--android:layout_width="match_parent"-->
    <!--android:layout_height="wrap_content"-->
    <!--android:layout_marginTop="10dp"-->
    <!--android:orientation="vertical">-->

    <!--<TextView-->
    <!--android:layout_width="wrap_content"-->
    <!--android:layout_height="wrap_content"-->
    <!--android:layout_alignParentLeft="true"-->
    <!--android:text="已用:458MB"-->
    <!--android:textSize="20dp" />-->

    <!--<TextView-->
    <!--android:layout_width="wrap_content"-->
    <!--android:layout_height="wrap_content"-->
    <!--android:layout_alignParentRight="true"-->
    <!--android:text="可用:12GB"-->
    <!--android:textSize="20dp" />-->
    <!--</RelativeLayout>-->


    <ListView
        android:id="@+id/list_system_apk"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:elevation="1dp"
        android:divider="#f00"
        android:dividerHeight="2dp"/>
</LinearLayout>
<?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"
    android:paddingBottom="20dp"
    android:paddingLeft="20dp"
    android:paddingRight="20dp"
    android:paddingStart="20dp"
    android:paddingTop="20dp"
    tools:context="com.example.appmanager.ActivityThirdApk">


    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="第三方应用程序"
        android:textSize="20sp" />

    <ListView
        android:descendantFocusability="blocksDescendants"
        android:id="@+id/list_third_apk"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:elevation="1dp"
        android:divider="#f00"
        android:dividerHeight="2dp"/>
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

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

        <ImageView
            android:id="@+id/im_icon"
            android:layout_width="50dp"
            android:layout_height="50dp"
            />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginStart="20dp"
            android:orientation="vertical"
            android:layout_marginLeft="20dp"
            android:layout_weight="3">

            <TextView
                android:id="@+id/tv_appname"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:text="程序名:"
                android:textSize="20sp" />

            <TextView
                android:id="@+id/tv_apppackge"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:text="包名:"
                android:textSize="13sp" />
        </LinearLayout>

        <Button
            android:focusable="false"
            android:id="@+id/btn_uninstall"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="卸载"
            />
    </LinearLayout>
</LinearLayout>
package com.example.appmanager;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
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);
    }

    public void onAllAPK(View view) {
        Intent intentALL = new Intent(MainActivity.this, ActivityAllApk.class);
        startActivity(intentALL);
    }

    public void onSysAPK(View view) {
        Intent intentSys = new Intent(MainActivity.this, ActivitySystemApk.class);
        startActivity(intentSys);
    }


    public void onThirdAPK(View view) {
        Intent intentThird = new Intent(MainActivity.this, ActivityThirdApk.class);
        startActivity(intentThird);
    }
}
package com.example.appmanager;

import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable;
import android.net.Uri;

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

/**
 * Created by y0n on 2017/5/20.
 */

public class GetAppsinfo {
    public static final int FILTER_ALL_APP = 0; // 所有应用程序
    public static final int FILTER_SYSTEM_APP = 1; // 系统程序
    public static final int FILTER_THIRD_APP = 2; // 第三方应用程序
    private Context mContext = null;
    private PackageManager mPackageManager = null;
    private List<AppsInfo> mAppsInfoList = new ArrayList<AppsInfo>();
    public GetAppsinfo(Context mContext) {
        this.mContext = mContext;
        // PackageManager 类表示已安装的应用程序信息
        mPackageManager = mContext.getPackageManager(); }
    public List<AppsInfo> filterApp(int filter){
        //查询所有已经安装的应用程序
        List<ApplicationInfo>applicationInfos=
                mPackageManager.getInstalledApplications(
                        PackageManager.GET_UNINSTALLED_PACKAGES);
        mAppsInfoList.clear();
        switch (filter){
            case FILTER_ALL_APP:
            {
                for (ApplicationInfo applicationInfo: applicationInfos ){
                    getApkInfo(applicationInfo);
                }
            }
            break;
            case FILTER_SYSTEM_APP:
            {
                for (ApplicationInfo applicationInfo : applicationInfos) {
                    if ((applicationInfo.flags &
                            ApplicationInfo.FLAG_SYSTEM) != 0) {
                        getApkInfo(applicationInfo);
                    }
                }
            }
            break;
            case FILTER_THIRD_APP:
            {
                for (ApplicationInfo applicationInfo : applicationInfos) {
                    // 非系统应用
                    if ((applicationInfo.flags &
                            ApplicationInfo.FLAG_SYSTEM) <= 0) {
                        getApkInfo(applicationInfo);
                    }
                    // 系统应用,但更新后变成不是系统应用了
                    else if ((applicationInfo.flags &
                            ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0) {
                        getApkInfo(applicationInfo);
                    }
                }
            }
            break;
        }
        return mAppsInfoList;
    }

    private void getApkInfo(ApplicationInfo app){
        AppsInfo appsInfo = new AppsInfo();
        // 获取应用名称
        String appName = app.loadLabel(mPackageManager).toString();
        String packageName = app.packageName; // 包名
        Drawable drIcon = app.loadIcon(mPackageManager); // 图标
        appsInfo.setStrApkName(appName);
        appsInfo.setStrPackageName(packageName);
        appsInfo.setDrIcon(drIcon);
        mAppsInfoList.add(appsInfo);
        System.out.println("程序名:" + appName +
                " 包名:" + packageName);
    }
    //卸载
    public void unInstall(String strPackgeName){
        Intent intent = new Intent(Intent.ACTION_DELETE);
        intent.setData(Uri.parse("package:"+ strPackgeName));
        mContext.startActivity(intent);
    }

}
package com.example.appmanager;

import android.graphics.drawable.Drawable;

/**
 * Created by y0nz1 on 2017/5/19.
 */

public class AppsInfo {
    String strApkName; //程序名
    String strPackageName; //包名
    Drawable drIcon; //图标

    public Drawable getDrIcon() {
        return drIcon;
    }

    public void setDrIcon(Drawable drIcon) {
        this.drIcon = drIcon;
    }

    public String getStrApkName() {
        return strApkName;
    }

    public void setStrApkName(String strApkName) {
        this.strApkName = strApkName;
    }

    public String getStrPackageName() {
        return strPackageName;
    }

    public void setStrPackageName(String strPackageName) {
        this.strPackageName = strPackageName;
    }

    public AppsInfo(Drawable drIcon, String strApkName, String strPackageName) {
        this.drIcon = drIcon;
        this.strApkName = strApkName;
        this.strPackageName = strPackageName;
    }

    public AppsInfo() {

    }
}
package com.example.appmanager;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

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

/**
 * Created by y0n on 2017/5/19.
 */

public class APKAdapter extends BaseAdapter {
    List<AppsInfo> mAppsInfoList = new ArrayList<AppsInfo>();
    Context mContext;

    public APKAdapter(List<AppsInfo> mAppsInfoList, Context mContext) {
        this.mAppsInfoList = mAppsInfoList;
        this.mContext = mContext;
    }

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

    @Override
    public Object getItem(int position) {
        return mAppsInfoList.get(position);
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder = null;
        View view = null;
        //1.当 covertView 为空时(第一次调用)
        if (convertView == null){
            //1.获取布局加载器
            LayoutInflater layoutInflater = LayoutInflater.from(mContext);
            //2.获取 view 对象
            view = layoutInflater.inflate(R.layout.item,null);
            //3.获取 item 中的控件对象
            viewHolder = new ViewHolder(view);
            view.setTag(viewHolder);

        }else {
            view = convertView;
            viewHolder = (ViewHolder) view.getTag();
        }
        //2.将信息显示都界面上
        AppsInfo appsInfo = (AppsInfo) getItem(position);
        viewHolder.mImIcon.setImageDrawable(appsInfo.getDrIcon());
        viewHolder.mTvAppName.setText(appsInfo.getStrApkName());
        viewHolder.mTvAppPackge.setText(appsInfo.getStrPackageName());

        return view;
    }
    public class ViewHolder{
        ImageView mImIcon = null;
        TextView mTvAppName = null;
        TextView mTvAppPackge = null;

        public ViewHolder(View view){
            mImIcon = (ImageView) view.findViewById(R.id.im_icon);
            mTvAppName = (TextView) view.findViewById(R.id.tv_appname);
            mTvAppPackge = (TextView) view.findViewById(R.id.tv_apppackge);

        }
    }
}
package com.example.appmanager;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;

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

import static com.example.appmanager.GetAppsinfo.FILTER_ALL_APP;

public class ActivityAllApk extends AppCompatActivity {

    private long mid;
    private String packgename;
    private List<AppsInfo> mAppsInfoList;
    private GetAppsinfo apkinfo;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_all_apk);
        // 1. 获取 ListView 对象
        ListView listView = (ListView) findViewById(R.id.list_all_apk);
        // 2. 创建适配器
        mAppsInfoList = new ArrayList<AppsInfo>();
        // 3. 获取APk信息
        apkinfo = new GetAppsinfo(getApplicationContext());
        mAppsInfoList = apkinfo.filterApp(FILTER_ALL_APP);
        APKAdapter adapter = new APKAdapter(mAppsInfoList, getApplicationContext());
        // 3. 关联 listView 对象
        listView.setAdapter(adapter);

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Log.v("apkinfo", "uninstall");
                mid = id;
                Button button = (Button) view.findViewById(R.id.btn_uninstall);
                button.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        packgename = mAppsInfoList.get((int) mid).getStrPackageName();
                        String appname = mAppsInfoList.get((int) mid).getStrApkName();
                        apkinfo.unInstall(packgename);
                        Toast.makeText(v.getContext(), "将卸载" + appname, Toast.LENGTH_SHORT).show();
                    }
                });
            }
        });
    }

}
package com.example.appmanager;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;

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

import static com.example.appmanager.GetAppsinfo.FILTER_SYSTEM_APP;

public class ActivitySystemApk extends AppCompatActivity {

    private long mid;
    private String packgename;
    private List<AppsInfo> mAppsInfoList;
    private GetAppsinfo apkinfo;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_system_apk);
        // 1. 获取 ListView 对象
        ListView listView = (ListView) findViewById(R.id.list_system_apk);
        // 2. 创建适配器
        mAppsInfoList = new ArrayList<AppsInfo>();
        // 3. 获取APk信息
        apkinfo = new GetAppsinfo(getApplicationContext());
        mAppsInfoList = apkinfo.filterApp(FILTER_SYSTEM_APP);
        APKAdapter adapter = new APKAdapter(mAppsInfoList, getApplicationContext());
        // 3. 关联 listView 对象
        listView.setAdapter(adapter);

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Log.v("apkinfo", "uninstall");
                mid = id;
                Button button = (Button) view.findViewById(R.id.btn_uninstall);
                button.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        packgename = mAppsInfoList.get((int)mid).getStrPackageName();
                        String appname = mAppsInfoList.get((int)mid).getStrApkName();
                        apkinfo.unInstall(packgename);
                        Toast.makeText(v.getContext(), "将卸载" + appname, Toast.LENGTH_SHORT).show();
                    }
                });
            }
        });
    }
}
package com.example.appmanager;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;

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

import static com.example.appmanager.GetAppsinfo.FILTER_THIRD_APP;
import static com.example.appmanager.R.layout.activity_third_apk;

public class ActivityThirdApk extends AppCompatActivity {

    private List<AppsInfo> mAppsInfoList;
    private String packgename;
    private long mid;
    private View mview;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(activity_third_apk);
        // 1. 获取 ListView 对象
        ListView listView = (ListView) findViewById(R.id.list_third_apk);
        // 2. 创建适配器
        mAppsInfoList = new ArrayList<AppsInfo>();
        // 3. 获取APk信息
        final GetAppsinfo apkinfo = new GetAppsinfo(getApplicationContext());
        mAppsInfoList = apkinfo.filterApp(FILTER_THIRD_APP);
        APKAdapter adapter = new APKAdapter(mAppsInfoList, getApplicationContext());
        // 3. 关联 listView 对象
        listView.setAdapter(adapter);


        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Log.v("apkinfo", "uninstall");
                mid = id;
                Button button = (Button) view.findViewById(R.id.btn_uninstall);
                button.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        packgename = mAppsInfoList.get((int)mid).getStrPackageName();
                        String appname = mAppsInfoList.get((int)mid).getStrApkName();
                        apkinfo.unInstall(packgename);
                        Toast.makeText(v.getContext(), "将卸载" + appname, Toast.LENGTH_SHORT).show();
                    }
                });
            }
        });
    }

}

15.获取html源码

<?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:id="@+id/activity_main"
    android:orientation="vertical"
    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.htmlsourceviewplus.MainActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <Button
            android:id="@+id/btn"
            android:text="访问hao123网页源码"
            android:textSize="20sp"
            android:onClick="openurl"
            android:layout_weight="1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
        <Button
            android:id="@+id/btn_cancel"
            android:onClick="cancel"
            android:text="取消执行"
            android:textSize="20sp"
            android:layout_weight="1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>

    </LinearLayout>


    <SeekBar
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/seekBar"/>

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <TextView
            android:id="@+id/tv_text"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:text="Hello World!"/>

    </ScrollView>

</LinearLayout>
package com.example.htmlsourceviewplus;

import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.SeekBar;
import android.widget.TextView;

import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

public class MainActivity extends AppCompatActivity {
    private Button mBtnOpenUrl;
    private Button mBtnCancel;
    private SeekBar mSeekBar;
    private TextView mTextView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mBtnOpenUrl = (Button) findViewById(R.id.btn);
        mBtnCancel = (Button) findViewById(R.id.btn_cancel);
        mSeekBar = (SeekBar) findViewById(R.id.seekBar);
        mTextView = (TextView) findViewById(R.id.tv_text);

        mBtnOpenUrl.setEnabled(true);
        mBtnCancel.setEnabled(false);

    }

    public void openurl(View view) {
        MyAyncTask myAyncTask = new MyAyncTask();
        myAyncTask.execute("http://www.hao123.com");

        mBtnOpenUrl.setEnabled(false);
        mBtnCancel.setEnabled(true);

    }

    public void cancel(View view) {
        mBtnOpenUrl.setEnabled(true);
        mBtnCancel.setEnabled(false);

    }
    //异步任务
    private class MyAyncTask extends AsyncTask<String, Integer, String>{
        //初始化UI
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            mSeekBar.setProgress(0);
            mSeekBar.setMax(100);

            mTextView.setText("loading ...");
        }
        //后台操作
        @Override
        protected String doInBackground(String... params) {
            try {
                // 1. 构造URL对象
                String path = params[0];
                URL url = new URL(path);

                // 2. 创建一个URL连接对象
                HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();

                // 3. 设置URL的请求模式或者其他信息
                urlConnection.setRequestMethod("GET");
                urlConnection.setConnectTimeout(5000);
                urlConnection.setRequestProperty("Accept-Encoding", "identity");

                // 4. 请求数据,获取返回码
                int code = urlConnection.getResponseCode();
                // 200 OK  302 found 404 not fount 500 内部错误
                if (code == 200) {
                    // 获取内容长度,需要指定RequestProperty
                    int nMaxLen = urlConnection.getContentLength();
                    int nLen = 0;

                    // 4.1 读取信息
                    InputStream inputStream = urlConnection.getInputStream();
                    byte[] bytes = new byte[50];
                    int iReadSize = 0;
                    // 创建字节流对象,用于保存输入流的信息
                    ByteArrayOutputStream byteObj = new ByteArrayOutputStream();
                    while (iReadSize != -1) {
                        // 循环读取数据信息,每次读取1024字节,会自动移动指针
                        // 第二个参数指的值字节数组的起始偏移
                        iReadSize = inputStream.read(bytes, 0, 50);
                        if (iReadSize == -1) break;
                        // 计算已经读取的长度
                        nLen += iReadSize;
                        // 更新进度
                        this.publishProgress((int) (((float) nLen / (float) nMaxLen) * 100));
                        byteObj.write(bytes, 0, iReadSize);

                    }
                    inputStream.close();
                    //获取字符
                    String strings = new String(byteObj.toByteArray());
                    return strings;
                }
            } catch (Exception e) {
                e.printStackTrace();
            }

            return null;
        }
        //更新进度
        @Override
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);
            mSeekBar.setProgress(values[0]);
        }
        //处理返回信息
        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            mTextView.setText(s);
        }
    }
}

16.解析Android清单文件

<?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:id="@+id/activity_main"
    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"
    android:orientation="vertical"
    tools:context="com.example.parsemanifast.MainActivity">

    <Button
        android:id="@+id/parsexml"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="解析Manifast"
        android:onClick="onParseXML"
        />
    <ListView
        android:id="@+id/listview1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:divider="#f00"
        android:dividerHeight="2dp"
        android:headerDividersEnabled="false">
    </ListView>

</LinearLayout>
<?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:id="@+id/activity_main"
    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.parsemanifast.MainActivity"
    android:orientation="vertical"
    >
   <TextView
     android:text="item"
     android:id="@+id/text1"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content" />


</LinearLayout>
package com.example.parsemanifast;

import android.content.res.AssetManager;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;

import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class MainActivity extends AppCompatActivity {

    private List<String> tagList;
    private List<String> retStr;

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

        }

    /**
     * 1.获取文件path,getAssets
     * 2.打开文件,inputStream
     * 3.new 一个字符数组
     * 4.new一个字符数组输出流对象
     * 5.循环读取,read到字符数组输出流对象中
     * 6.再转成字符串
     * 7.再解析,myXMLParse
     * 8.创建ui线程显示到界面
     */
    //读取文件并解析,测试
    public void onParseXML(View view) {
        String xml = null;
        AssetManager assetManager = getAssets();
        try {
            InputStream inputStream = assetManager.open("manifast.xml");
            byte[] bytes = new byte[1024];
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
            int nReadSize = 0;
            while (nReadSize != -1) {
                nReadSize = inputStream.read(bytes, 0, 1024);
                if (nReadSize == -1) break;
                byteArrayOutputStream.write(bytes);
            }
            inputStream.close();
            xml = new String(byteArrayOutputStream.toByteArray());
            //调用标签解析函数
            //测试
            List<String> listTag = myParseTag(xml);
            retStr = new ArrayList<>();
            int j = 0;
            for (int i = 0; i < listTag.size(); i ++)
            {
                Map<String, String> mapnameval = myParesVat(xml, listTag.get(i));
                for (Map.Entry<String, String> entry : mapnameval.entrySet())
                {
                    System.out.println("<" + listTag.get(i) + ">:"
                            + "\t" + entry.getKey()
                            + "=" + entry.getValue());
                    String strTextView = "<" + listTag.get(i) + ">:"
                            + "\t" + entry.getKey()
                            + "=" + entry.getValue();
                    retStr.add(strTextView);

                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        //1.获取对象
        ListView lv = (ListView) findViewById(R.id.listview1);
        //2.获取数据

        ArrayAdapter<String> arrayAdapter =
                new ArrayAdapter<String>(this, R.layout.item,R.id.text1, retStr);
        // setListAdapter();
        lv.setAdapter(arrayAdapter);

    }

    /**
     * 1.获取xml解析工厂
     * 2.获取xml解析器
     * 3.设置解析的文件
     * 4.获取事件类型
     * 5.循环解析
     * 6.getName,保存到list中
     * 7.返回List数据为标签列表
     */
    //解析出标签,保存到List中
    public List<String> myParseTag(String xml) {
        XmlPullParserFactory factory = null;
        //标签列表
        tagList = new ArrayList<>();
//        //属性列表
//        attrList = new ArrayList<>();
//        //属性和值的映射
//        Map<String, String> attrMap = new HashMap<>();
//        //属性和值的映射的列表
//        List<Map<String, String>> attrvalmapList= new ArrayList<>();
//        //标签和属性的映射
//        Map<List<String>, Map<String, String>> tagAttrMap = new HashMap<>();
//        //保存每个映射到列表中
//        List<Map<String, Map<String, String>>> xmlList = new ArrayList<>();
//
//        List<map《标签,map《属性,值》》>

        try {
            factory = XmlPullParserFactory.newInstance();
            XmlPullParser xpp = factory.newPullParser();
            xpp.setInput(new StringReader(xml));
            int eventType = xpp.getEventType();
            while (eventType != XmlPullParser.END_DOCUMENT) {
                if (eventType == XmlPullParser.START_DOCUMENT) {
                    System.out.println("Start Document");
                    //tagList.add(xpp.getName());
                } else if (eventType == XmlPullParser.START_TAG) {
                    System.out.println("Start tag " + xpp.getName());
                    tagList.add(xpp.getName());
                } else if (eventType == XmlPullParser.END_TAG) {
                    System.out.println("End tag " + xpp.getName());
                    //tagList.add(xpp.getName());
                }
                eventType = xpp.next();
            }
            return tagList;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    //解析标签中的属性
    public Map<String, String> myParesVat(String xml, String StrTag) {
        Map<String, String> attrvalmap = new HashMap<>();
        List<Map<String, String>> attrvalmaplist = new ArrayList<>();
        XmlPullParserFactory factory = null;
        try {
            factory = XmlPullParserFactory.newInstance();
            XmlPullParser xpp = factory.newPullParser();
            xpp.setInput(new StringReader(xml));
            int eventType = xpp.getEventType();
            while (eventType != XmlPullParser.END_DOCUMENT) {
                if (eventType == XmlPullParser.START_DOCUMENT) {
                    //System.out.println("Start Document");
                    //tagList.add(xpp.getName());
                } else if (eventType == XmlPullParser.START_TAG) {
                    //System.out.println("Start tag " + xpp.getName());
                    //判断是否等于某个标签
                    if (StrTag.equals(xpp.getName())) {
                        //循环保存属性和值
                        if (xpp.getAttributeCount() == 0)
                        {
                            String attrname = "无属性";
                            String attrval = "无值";
                            attrvalmap.put(attrname, attrval);
                            attrvalmaplist.add(attrvalmap);
                        }
                        else {
                            for (int i = 0; i < xpp.getAttributeCount(); i++) {
                                String attrname = xpp.getAttributeName(i);
                                String attrval = xpp.getAttributeValue(i);
                                attrvalmap.put(attrname, attrval);
                                //attrvalmaplist.add(attrvalmap);
                            }
                        }
                        return attrvalmap;
                        //return attrvalmaplist;
                    }
                } else if (eventType == XmlPullParser.END_TAG) {
                    //System.out.println("End tag " + xpp.getName());
                    //tagList.add(xpp.getName());
                }
                eventType = xpp.next();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}


17.jsoup库的使用

package com.example.jsoup;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

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

public class MainActivity extends AppCompatActivity {

    private TextView textView;
    private List<String> content = new ArrayList<>();

    //http://m.kugou.com/
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = (TextView) findViewById(R.id.tv_show);
        textView.setText("抓取中...");
        runSubThread();
    }
    public void runSubThread(){
        new Thread(){
            @Override
            public void run() {
                super.run();
                String path = "http://m.kugou.com";
                try {
                    Document doc = Jsoup.connect(path).userAgent("Mozilla/5.0 (Linux;" +
                            " Android 6.0;" +
                            " Nexus 5 Build/MRA58N) AppleWebKit/537.36" +
                            " (KHTML, like Gecko) Chrome/58.0.3029.110 Mobile Safari/537.36").
                            timeout(5000).
                            get();
                    Elements links = doc.select("a[href]");
                    Elements media = doc.select("img[src]");
                    Elements imports = doc.select("link[href]");
                    System.out.println(String.format("Media:(%d)", media.size()));
                    for (Element src : media)
                    {
                        if (src.tagName().equals("img")){
                            System.out.println("<img>" + String.format("%s:%s",
                                    src.tagName(),
                                    src.attr("abs:src")));
                            content.add("<img>" + String.format("%s:%s",
                                    src.tagName(),
                                    src.attr("abs:src")));
                        }
                    }
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            for (int i = 0; i < content.size(); i++)
                                textView.setText(content.get(i));
                        }
                    });
                }
                catch (Exception e) {
                    e.printStackTrace();
                }

            }
        }.start();
    }
}

18.使用jsoup解析KuGou

package com.example.getkugoumusic;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;

import org.json.JSONObject;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

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

//1.访问http://m.kugou.com获取网页源码
//2.然后通过选择器进行过滤,过滤出歌曲列表中的id属性
//3.提取其中的id值为songs_BB8BF48B08C0AEC4F8058EB95C8285B9,提取出其中的hash值
//4.构造访问服务器的url = “http://m.kugou.com/app/i/getSongInfo.php?cmd=playInfo&hash=
// “+id的hash值 + “&from=mkugou”,采用GET方式发送
//5.获取从服务端返回的json格式数据
//6.构造歌曲信息java bean对象,解析json数据
//7.通过返回的json数据获取其中的歌曲资源的url,访问资源,保存到本地文件中
//8.测试文件是否可用。

public class MainActivity extends AppCompatActivity {

    private List<String> strIDList;
    private List<Document> docsList;
    private List<KugouMusicInfo> kugouMusicInfosList;
    private TextView textView;

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

        visitKugou();
        textView = (TextView) findViewById(R.id.text1);

    }

    //访问http://m.kugou.com获取新歌列表中的li标签的id属性和id值
    public void visitKugou(){
        //创建线程
        new Thread(){
            @Override
            public void run() {
                super.run();
                //定义path
                String path = "http://m.kugou.com";
                try {
                    //使用jsoup连接Kugou,设置代理及超时
                    Document doc = Jsoup.connect(path).userAgent("Mozilla/5.0 (Linux;" +
                            " Android 6.0;" +
                            " Nexus 5 Build/MRA58N) AppleWebKit/537.36" +
                            " (KHTML, like Gecko) Chrome/58.0.3029.110 Mobile Safari/537.36").
                            timeout(5000).
                            get();
                    //设置选择器,查找li标签中的id属性
                    Elements liID = doc.select("li[id]");
                    //测试输出
                    System.out.println(String.format("li:%d", liID.size()));
                    //使用list保存提取出来的strID
                    strIDList = new ArrayList<>();
                    for (Element li : liID){
                        if (li.tagName().equals("li")){
                            System.out.println("<li>" + String.format("%s:%s",
                                    li.tagName(),
                                    li.attr("id")));
                            String strID = li.attr("id");
                            int begin = strID.indexOf("_") + 1;
                            strID = strID.substring(begin, 38);
                            System.out.println(strID);
                            strIDList.add(strID);
                        }
                    }

                    //构造访问服务器的URL采用get方式
                    //“http://m.kugou.com/app/i/getSongInfo.php?cmd=playInfo&hash=
                    // “+id的hash值 + “&from=mkugou”,采用GET方式发送
                    //创建一个list保存这个对象
                    kugouMusicInfosList = new ArrayList<KugouMusicInfo>();
                    for (int i = 0; i < strIDList.size(); i++)
                    {
                        String strPath = "http://m.kugou.com/app/i/getSongInfo.php?cmd=playInfo&hash="
                                + strIDList.get(i) + "&from=mkugou";

                       // docsList = new ArrayList<Document>();
                        //使用构造好的url访问服务器,并接收返回的json数据,并保存在docList中
                        Document docs =  Jsoup.connect(strPath).userAgent("Mozilla/5.0 (Linux;" +
                                " Android 6.0;" +
                                " Nexus 5 Build/MRA58N) AppleWebKit/537.36" +
                                " (KHTML, like Gecko) Chrome/58.0.3029.110 Mobile Safari/537.36").
                                timeout(5000).
                                get();

                        //docsList.add(docs);

                        //创建一个MusicInfo对象
                        final KugouMusicInfo kugouMusicInfo = new KugouMusicInfo();

                        //对获取到的docs字符串进行提取,取得json格式数据
                        String strDocs = docs.toString();
                        int begin = strDocs.indexOf("<body>") + "<body>".length();
                        int end = strDocs.indexOf("</body>");
                        strDocs = strDocs.substring(begin, end);

                        //json解析
                        //获取json对象
                        JSONObject jsonObject = new JSONObject(strDocs);
                        //根据key获取value
                        String songName = jsonObject.getString("songName");
                        kugouMusicInfo.setSongName(songName);
                        String singerName = jsonObject.getString("singerName");
                        kugouMusicInfo.setSingerName(singerName);
                        String fileSize = jsonObject.getString("fileSize");
                        kugouMusicInfo.setFileSize(fileSize);
                        String musicUrl = jsonObject.getString("url");
                        kugouMusicInfo.setMusicUrl(musicUrl);
                        String imgUrl = jsonObject.getString("imgUrl");
                        kugouMusicInfo.setImgUrl(imgUrl);
                        String extName = jsonObject.getString("extName");//音乐类型
                        kugouMusicInfo.setExtName(extName);
                        String timeLength = jsonObject.getString("timeLength");
                        kugouMusicInfo.setTimeLength(timeLength);
                        System.out.println(kugouMusicInfo.toString());
                        kugouMusicInfosList.add(kugouMusicInfo);

                        //使用ui线程将数据显示在界面上
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                textView.setText(kugouMusicInfo.toString());
                            }
                        });
                    }

                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }.start();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值