标签 安卓 下的文章

Android 10 及更低版本 Wifi 调试 ,需要借助 USB

  • 手机和电脑需连接在同一 WiFi 下;
  • 手机开启开发者选项和 USB 调试模式,并通过 USB 连接电脑(即adb devices -l可以查看到手机);
  • 执行adb tcpip 5555命令,设置手机的监听;
  • 拔掉 USB 线,找到手机的 IP 地址;
  • 通过 IP 连接到手机adb connect ip(端口默认:5555);
  • adb devices -l命令查看是否连接成功。

Wi-Fi 调试(Android 11 及更高版本,无需借助 USB)

Android 11 开始支持 ADB 以wifi方式连接手机调试。

  • 手机和电脑需连接在同一 WiFi 下;
  • 保证 SDK 为最新版本(adb --version ≥ 30.0.0);
  • 手机启用开发者选项和无线调试模式(会提示确认);
  • 允许无线调试后,选择使用配对码配对。记下显示的配对码、IP 地址和端口号;
  • 运行adb pair ip:port,使用第 4 步中的 IP 地址和端口号;
  • 根据提示,输入第 3 步中的配对码,系统会显示一条消息,表明您的设备已成功配对;
    (仅适用于 Linux 或 Windows)运行 adb connect ip:port

其他命令

  • 断开连接adb disconnect
  • 重连 adb connect
  • 如果统一 WLAN 下,adb connect 失败后,可重置 adb,再次连接adb kill-serveradb connect

创建数据库

package com.itheima.sqlite;


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

public class MyOpenHelper extends SQLiteOpenHelper {
    /**
     * context  上下文
     * name:数据库的名字 
     * factory 目的创建cursor对象   
     * version 数据库的版本   从1开始
     */
    public MyOpenHelper(Context context) {
        super(context, "itheima.db", null,1);
    }

    /**
     * Called when the database is created for the first time.
     * 当数据库第一次创建的时候调用
     * 那么这个方法特别适合做表结构的初始化  创建表就是写sql语句
     */
    public void onCreate(SQLiteDatabase db) {

        db.execSQL("create table info(_id integer primary key autoincrement,name varchar(20),phone varchar(20))");
        
    }
    /**
     * Called when the database needs to be upgraded
     * 当数据库版本升级的时候调用 
     * 这个方法适合做   表结构的更新
     */
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

        db.execSQL("alter table info add phone varchar(20)");
        
    }

}

利用谷歌封装好的API对数据库进行增删改查

package com.itheima.sqlite;

import java.util.ArrayList;
import java.util.List;
import android.os.Bundle;
import android.provider.Contacts.Intents.Insert;
import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import com.itheima.crud.R;

public class MainActivity extends Activity {

    private MyOpenHelper myOpenHelper;
    private List<Person> lists;
    private ListView lv;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        //[0]找到lv
        
        lv = (ListView) findViewById(R.id.lv);
        
        myOpenHelper = new MyOpenHelper(getApplicationContext());
        
        
        //[1]定义一个集合用来存listview 要展示的数据 
        lists = new ArrayList<Person>();
        
        //打开或者创建数据库  如果是第一次就是创建   
                //SQLiteDatabase sqLiteDatabase = myOpenHelper.getWritableDatabase();
        //打开或者创建数据库  如果是第一次就是创建     如果磁盘满了 返回只读的
                //SQLiteDatabase readableDatabase = myOpenHelper.getReadableDatabase();
    
    }
    //点击按钮增加一条记录
    public void click1(View v){
        //[1]获取数据库对象
        SQLiteDatabase db = myOpenHelper.getWritableDatabase();
        //[2]执行增加一条的sql语句 
                //db.execSQL("insert into info(name,phone) values(?,?)", new Object[]{"张三","1388888"});
        /**
         * table 表名  
         * ContentValues 内部封装了一个map   key:  对应列的名字  value对应的值
         */
        ContentValues values = new ContentValues();
        values.put("name", "王五");
        values.put("phone", "110");
        //返回值代表插入新行的id 
        long insert = db.insert("info", null, values); //底层就在组拼sql语句
        //[3]数据库用完需要关闭
        db.close();
        
        if (insert>0) {
            Toast.makeText(getApplicationContext(), "添加成功", 1).show();
        }else {
            Toast.makeText(getApplicationContext(), "添加fail", 1).show();
        }
        
    }
    
    
    //删除
    public void click2(View v){
        SQLiteDatabase db = myOpenHelper.getWritableDatabase();
                //db.execSQL("delete from info where name=?", new Object[]{"张三"});
        //返回值代表影响的行数 
        int delete = db.delete("info", "name=?", new String[]{"王五"});
        db.close();

        Toast.makeText(getApplicationContext(), "删除了"+delete+"行", 0).show();
        
    }
    
    //更新 
    public void click3(View v){
        SQLiteDatabase db = myOpenHelper.getWritableDatabase();

               //db.execSQL("update info set phone=? where name=? ", new Object[]{"138888888","张三"});    
        ContentValues values = new ContentValues();
        values.put("phone", "114");
        //代表更新了多少行 
        int update = db.update("info", values, "name=?", new String[]{"王五"});
        db.close();
        
        Toast.makeText(getApplicationContext(), "更新了"+update+"行", 0).show();
    }
    
    
    //查找
    public void click4(View v){
        
        SQLiteDatabase db = myOpenHelper.getReadableDatabase();

        //columns 代表你要查询的列
        //selection 根据什么查询phone 
//        Cursor cursor = db.query("info", new String[]{"name","phone"}, "name=?", new String[]{"王五"}, null, null, null);
        Cursor cursor = db.query("info", null,null, null, null, null, null);

                //Cursor cursor = db.rawQuery("select * from info", null);
        if (cursor!= null&&cursor.getCount()>0) {
            while(cursor.moveToNext()){
                //columnIndex代表列的索引 
                String name = cursor.getString(1);
                String phone = cursor.getString(2);
                
                //把数据封装到javabean
                Person person = new Person();
                person.setName(name);
                person.setPhone(phone);
                
                //把javabena对象加入到集合
                lists.add(person);
                
            }
                    
            
        }
        
        
    }        
}

数据库的创建

定义一个类继承SQLiteOpenHelper

package com.itheima.sqlite;

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

public class MyOpenHelper extends SQLiteOpenHelper {
    /**
     * context  上下文
     * name:数据库的名字 
     * factory 目的创建cursor对象   
     * version 数据库的版本   从1开始
     */
    public MyOpenHelper(Context context) {
        super(context, "itheima.db", null,1);        
    }
    /**
     * 当数据库第一次创建的时候调用
     * 那么这个方法特别适合做表结构的初始化  创建表就是写sql语句
     */
    public void onCreate(SQLiteDatabase db) {
        //id 一般以_id 
        db.execSQL("create table info(_id integer primary key autoincrement,name varchar(20),phone varchar(20))");
    }
    /**
     * 当数据库版本升级的时候调用 
     * 这个方法适合做   表结构的更新
     */
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("alter table info add phone varchar(20)");
    }

}

安卓利用SQL语句进行增删改查

package com.itheima.sqlite;

import android.os.Bundle;
import android.app.Activity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.view.Menu;
import android.view.View;

public class MainActivity extends Activity {
private MyOpenHelper myOpenHelper;
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    myOpenHelper = new MyOpenHelper(getApplicationContext());
    //打开或者创建数据库  如果是第一次就是创建   
    //SQLiteDatabase sqLiteDatabase = myOpenHelper.getWritableDatabase();
    //打开或者创建数据库  如果是第一次就是创建     如果磁盘满了 返回只读的
    //SQLiteDatabase readableDatabase = myOpenHelper.getReadableDatabase();
        
}

//点击按钮增加一条记录
public void click1(View v){
    //[1]获取数据库对象
    SQLiteDatabase db = myOpenHelper.getWritableDatabase();
    //[2]执行增加一条的sql语句 
    db.execSQL("insert into info(name,phone) values(?,?)", new Object[]{"小鸣","19189897878"});
    //[3]数据库用完需要关闭
    db.close();
    
}


//删除
public void click2(View v){
    SQLiteDatabase db = myOpenHelper.getWritableDatabase();
    db.execSQL("delete from info where name=?", new Object[]{"小鸣"});
    db.close();
    
}

//更新 
public void click3(View v){
    SQLiteDatabase db = myOpenHelper.getWritableDatabase();

    db.execSQL("update info set phone=? where name=? ", new Object[]{"1910000000","小鸣"});
    
    db.close();
}

//查找
public void click4(View v){
    SQLiteDatabase db = myOpenHelper.getReadableDatabase();
    Cursor cursor = db.rawQuery("select * from info", null);
    if (cursor!= null&&cursor.getCount()>0) {
        while(cursor.moveToNext()){
            //columnIndex代表列的索引 
            String name = cursor.getString(1);
            String phone = cursor.getString(2);
            System.out.println("name:"+name+";phone:"+phone);    
        }
    }
    
    
}

}

附:布局文件
<Button

    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onClick="click1"
    android:text="add" />

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onClick="click2"
    android:text="delete" />

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onClick="click3"
    android:text="update" />

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onClick="click4"
    android:text="find" />


在xml布局文件中添加

android:singleLine="true"
android:ellipsize="marquee"
android:focusable="true"

这些属性
即:

    <TextView
    android:id="@+id/textview1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:singleLine="true"
    android:ellipsize="marquee"
    android:focusable="true"
    android:focusableInTouchMode="true"
    android:text="@string/hello_world" />

如果是多个TextView,则需要把定义一个类继承TextView,并且把TextView改成包名+自己定义的类名
代码示例如下:

  <com.sunxiaoning.marqueetextviewdemo.MarqueeText
    android:id="@+id/textview1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:singleLine="true"
    android:ellipsize="marquee"
    android:focusable="true"
    android:focusableInTouchMode="true"
    android:text="@string/hello_world" />
 <com.sunxiaoning.marqueetextviewdemo.MarqueeText
    android:layout_below="@+id/textview1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="10dp"
    android:singleLine="true"
    android:ellipsize="marquee"
    android:focusable="true"
    android:focusableInTouchMode="true"
    android:text="@string/hello_world" />

同时自定义一个类,继承TextView重写TextView的所有方法和isFocused()方法,使isFocused()的返回值为true

package com.sunxiaoning.marqueetextviewdemo;

import android.content.Context;
import android.util.AttributeSet;
import android.widget.TextView;

public class MarqueeText extends TextView{

    public MarqueeTexct(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        
    }

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

    public MarqueeTexct(Context context) {
        super(context);
        
    }

    public boolean isFocused() {
        return true;
    }

}

TextView控件的常见属性

android:id 控件的id
android:layout_width 控件的宽度
android:layout_height 控件的高度
android:singleLine 单行显示
android:text 文本内容
android:textSize 文本大小
android:textColor 文本颜色
android:background 控件背景


EditText控件的常见属性

android:id 控件的id
android:layout_width 控件的宽度
android:layout_height 控件的高度
android:text 文本内容
android:textSize 文本大小
android:textColor 文本颜色
android:background 控件背景
android:hint 输入提示文本
android:inputType 输入文本类型


ImageView(显示图片的一个控件)常见属性

android:src ImageView的内容图像
android:background ImageView的背景图片

安卓按钮的四大点击事件整理
首先写一下xml文件

<Button
    android:id="@+id/button1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_below="@+id/editText1"
    android:text="拨号" />

<Button
    android:id="@+id/button2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_below="@+id/button1"
    android:layout_marginTop="14dp"
    android:text="button1" />

<Button
    android:id="@+id/button3"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBaseline="@+id/button2"
    android:layout_alignBottom="@+id/button2"
    android:layout_marginLeft="26dp"
    android:layout_toRightOf="@+id/button2"
    android:text="button2" />

<Button
    android:id="@+id/button4"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBaseline="@+id/button3"
    android:layout_alignBottom="@+id/button3"
    android:layout_marginLeft="18dp"
    android:layout_toRightOf="@+id/button3"
    android:text="button3" />

<Button
    android:onClick="click"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignRight="@+id/button3"
    android:layout_below="@+id/button3"
    android:layout_marginTop="62dp"
    android:text="test" />

点击事件
【1】定义一内部类去实现按钮的点击事件

public class MainActivity extends ActionBarActivity {

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //加载一个布局
        setContentView(R.layout.activity_main);
        //找到按钮
        Button btn_call = (Button) findViewById(R.id.button1);
        //给button按钮设置一个点击事件
        btn_call.setOnClickListener(new MyClickListener());
    }
    //定义一个类去实现   按钮需要的接口类型
    private class MyClickListener implements OnClickListener{
        
        //当按钮被点击的时候调用
        @Override
        public void onClick(View v) {
            System.out.println("我被点击了");
            }
        }
    }    
}

【2】通过匿名内部类去实现

public class MainActivity extends ActionBarActivity {
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //加载一个布局
        setContentView(R.layout.activity_main);
        //找到按钮
        Button btn_call = (Button) findViewById(R.id.button1);
        //给button按钮设置一个点击事件
        btn_call.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                System.out.println("按钮被点击了");
            }
        });
    }    
}

【3】让当前类实现OnClickListener接口类型(用于布局里面有很多按钮需要被点击的时候)

public class MainActivity extends ActionBarActivity implements OnClickListener {    
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 加载一个布局
        setContentView(R.layout.activity_main);
        
        // 找到按钮
        Button btn_call = (Button) findViewById(R.id.button1);
        Button btn_call1 = (Button) findViewById(R.id.button2);
        Button btn_call2 = (Button) findViewById(R.id.button3);
        Button btn_call3 = (Button) findViewById(R.id.button4);
        // 给button按钮设置一个点击事件
        // 按钮的第三种点击事件
        btn_call.setOnClickListener(this);
        btn_call1.setOnClickListener(this);
        btn_call2.setOnClickListener(this);
        btn_call3.setOnClickListener(this);
    }

    // 当点击按钮的时候执行
    public void onClick(View v) {
        // 具体判断点击的哪个按钮
        switch (v.getId()) {
        case R.id.button1:
            System.out.println("1按钮被点击了");
            break;
        case R.id.button2:
            System.out.println("2按钮被点击了");
            break;
        case R.id.button3:
            System.out.println("3按钮被点击了");
            break;
        case R.id.button4:
            System.out.println("4按钮被点击了");
            break;

        default:
            break;
        }
    }
}

【4】在按钮的布局上加上一个onClick属性 在Activity里面定义一个方法 方法名和属性名相同(适合自己做一些demo)

public class MainActivity extends ActionBarActivity  {

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 加载一个布局
        setContentView(R.layout.activity_main);
    }
    //声明一个方法  方法名和你要点击的这个按钮  在布局中的onClick属于一样
    public void click(View v) {
        System.out.println("按钮被点击了");
    }

    }

}







配置环境

想要在电脑的任意位置使用adb命令就需要配置环境变量
右击“此电脑”->选择“属性”->选择“高级系统设计”->选择“高级”->选择“环境变量”->找到"path"
QQ截图20170924091227.png
选中"path"之后->点击“编辑”->选择“新建”
QQ截图20170924091323.png
填入adb的路径即可
QQ截图20170924091355.png
最后确认退出即可

常见命令

1. adb kill-server  关闭adb服务进程。
2. adb start-server  开启服务
3.adb install [-r] [-s]  <应用名>  
    这个命令将指定的apk文件安装到设备上.
   -r 强制安装(在某些情况下可以已有些应用程序在运行或不可写,可加上此参数强制安装)
   -s 将apk文件安装在SD-Card
4.adb uninstall [-k] <应用的包名>    卸载应用
   -k 参数,为卸载软件但是保留配置和缓存文件.
5.adb shell  进入手机终端
6.adb push <本地路径> <远程路径>    用push命令可以把本机电脑上的文件或者文件夹复制到设备(手机)
7.adb pull <远程路径> <本地路径>    用pull命令可以把设备(手机)上的文件或者文件夹复制到本机电脑



在定义了一个类去实现OnClickListener接口的时候无法复写public void onClick(View v)方法,而是只能复写public void onClick(DialogInterface arg0, int arg1) 方法。
主要的原因就是导包的时候发生了错误,解决途径也很简单,只需要删除

import android.content.DialogInterface.OnClickListener;

然后重新导入

import android.view.View.OnClickListener;