Andriod期末复习总结

2023-11-01

一.安卓项目的目录结构

AndroidManifest.xml,项目清单文件,设置应用名称、图标等属性。

libs:项目依赖的外部库

src:Java源文件

bin:目标文件,Java字节码(.class)、资源打包文件(.ap_)和Dalvik虚拟机的可执行文件(*.dex)

gen:R.java文件

res:

layout:XML布局文件

values:多种XML文件

drawable_ldpidrawable_mdpidrawable_hdpidrawable_xhdpi`这四个子目录分别存放低分辨率、中分辨率、高分辨率、超高分辨率的4种图片文件

二.如何把一个APP设置没有标题栏

1.AndroidManifest.xml中配置

实现全屏效果:

android:theme="@android:style/Theme.NoTitleBar.Fullscreen"

实现无标题栏(但有系统自带的任务栏):

android:theme="@android:style/Theme.NoTitleBar"

2.编写代码设置

在onCreate()方法中加入如下代码即可

实现全屏效果:

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,  WindowManager.LayoutParams.FLAG_FULLSCREEN);

实现无标题栏(但有系统自带的任务栏):

requestWindowFeature(Window.FEATURE_NO_TITLE);

三.安卓存储数据方式(重要)

文件存储、SQLite数据库、SharedPreferences、ContentProvider、网络

1.SharedPreferences

优点: 轻量级,以键值对的方式进行存储,使用方便,易于理解
采用的是 XML 文件形式存储在本地,程序卸载后会也会一并被清除,不会残留信息
缺点: 列表式的数据不支持,储存相对单一,无法条件查询,不适合大量的数据存储。 在跨进程通讯中不去使用 SharedPreferences 键值对不宜过多

2.文件存储

**优点:**可以在设备本身的存储设备或者外接的存储设备中创建用于保存数据的文件。

**缺点:**同样在默认的状态下,文件是不能在不同的程序间共享。

3.ContentProvider

Android 系统中能实现所有应用程序共享的一种数据存储方式,由于数据通常在各应用间的是互相私密的,所以此存储方式较少使用,但是其又是必不可少的一种存储方式。例如音频,视频,图片和通讯录,一般都可以采用此种方式进行存储。每个 ContentProvider 都会对外提供一个公共的 URI(包装成 Uri 对象),如果应用程序有数据需要共享时,就需要使用 ContentProvider 为这些数据定义一个 URI,然后其他的应用程序就通过 Content Provider 传入这个 URI 来对数据进行操作。

4.SQLite 数据库

优点: 轻量级,独立性,隔离性,安全性
缺点: SQLite 在并发的读写方面性能不是很好,数据库有时候可能会被某个读写操作独占,可能会导致其他的读写操作被阻塞或者出错。

5.网络存储

优点: 几乎可以不用担心内存问题,本地处理麻烦的可以交由服务器处理
缺点: 完全依赖于网络 ,网络延迟和资费成本都会上升

四.安卓布局(简答)(重要)

框架布局(FrameLayout):控件从屏幕左上角开始布局。

相对布局(RelativeLayout): 以其他控件为参照布局。

绝对布局(AbsoluteLayout):以屏幕坐标布局。

表格布局(TableLayout):按照行列方式布局。

线性布局(LiearLayout): 屏幕垂直或水平方向布局。

约束布局 ConstraintLayout

五.线性布局和相对布局的特性有哪些

LinearLayout 继承自 ViewGroup,可以将所包含的 View 按照线性方式一个一个的排列起来,即将 View 排列成一行(水平布局)或者排列成一列(垂直布局)。LinearLayout 有一个很关键的属性:android:orientation,可以用它来设置布局的方向,默认是横向。

RelativeLayout可以指定子视图相对于父视图或彼此(通过 ID 指定)的位置。因此,您可以按照右边框对齐两个元素,或者使它们一上一下,屏幕居中,左侧居中,等等。默认情况下,所有子视图均绘制在布局的左上角,因此您必须使用中提供的各种布局属性定义每个视图的位置。

六.Activity 的生命周期方法有哪些,如何演示(重点)

6种:onCreate()、onStart()、onResume()、onPause()、onStop()和onDestroy()。

程序第一次进入时生命周期方法执行顺序是:
oncreate,onstart,onresume
如果你直接退出程序,执行顺序是:
onpause,onstop,ondestroy

如果在进入程序后,往别的界面做跳转,那么执行顺序是:
onpause,onstop
当从别的界面按返回键回来时,执行顺序是:(它并没有再次调用oncreate,所以这个oncreate方法只会执行一次)
onstart,onresume

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.i("MainActivity","onCreate方法执行了");
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.i("MainActivity","onStart方法执行了");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.i("MainActivity","onResume方法执行了");
    }

    /**
     大家可以把第二个界面弄成一个覆盖第一个界面的透明界面,然后再去观察activity生命周期方法的执行是如何的
     */
    @Override
    protected void onPause() {
        super.onPause();
        Log.i("MainActivity","onPause方法执行了");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.i("MainActivity","onStop方法执行了");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.i("MainActivity","onDestroy方法执行了");
    }

    public void jump(View view) {
        Intent intent = new Intent(MainActivity.this,MainActivity2.class);
        startActivity(intent);
    }
}

在Android生命周期过程中,Activity一般表现为哪4种状态?

Running:拥有焦点,可以与用户交互。

Paused:失去焦点,但是依然可见。

Stopped:失去焦点,不可见。

Killed:Activity 被杀掉以后或者被启动以前。

七.意图启动activity的方式,分别怎么用,activity之间传数据怎么通过意图传数据

(1)激活另一个手机的方式

public void onClick(View v){
	//激活系统的另一个程序
	Intent intent = new Intend();
	intent.setAction("andriod..intent.action.VIEW");
	intent.addCategory("andriod.intent.categeory.DEFAULT");
	intent.addCategory("andriod.intent.category.BROWSABLE");
	intent.setData(Uri.parse("http://www.hncu.edu.cn/"));
	startActivity(intent);

监听器

<activity
            android:name="com.cy.app.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

(2)意图启动activity的方式

public void click01(View view){//显式
    	Intent intent = new Intent(this,MainActivity02.class);
    	startActivity(intent);
    }
  
    public void click02(View view){//隐式
    	Intent intent = new Intent();
    	intent.setAction("com.cy.app.yinshi");
    	intent.addCategory("android.intent.category.DEFAULT");
    	startActivity(intent);
    }

隐式意图需要过滤器

<activity
            android:name="com.cy.app.YinShiActivity"
            android:label="@string/title_activity_yin_shi" >
            <intent-filter>
                <action android:name="com.cy.app.yinshi"/>
                <category android:name="android.intent.category.DEFAULT"/>
                </intent-filter>
        </activity>

(3)如何传递数据

直接传递:intent.putExtra(key, value)

第一个Activity,发送数据

//创建意图对象
Intent intent = new Intent(this,TwoActivity.class);
//设置传递键值对
intent.putExtra("data",str);
//激活意图
startActivity(intent);

第二个Activity接收数据

// 获取意图对象
Intent intent = getIntent();
//获取传递的值
String str = intent.getStringExtra("data");
//设置值
tv.setText(str);

八.显示意图和隐式意图有什么区别和使用场景

显示意图:必须要指定被开启的 Activity 的类名或者路径名激活自己应用程序内部的组件,推荐使用显示意图,效率高

隐式意图:只需要指定 action(动作)和 data(数据)即可激活别的应用程序界面,或者自己应用程序的某个界面需要暴露给别的应用程序调用,效率低

2Intent定义:

Intent概述:intent是android程序中组件之间进⾏交互的⼀种重要⽅式,它指明当前组件想要执⾏的动作,并且可以在各个组件之间传递数据。
Intent的作⽤:启动活动、启动服务、发送⼴播等

九.Android常用的四种对话框下(dialog),常用的控件及其用途

package cn.hncu.a13dialogdemo;

import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;

import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.widget.MultiAutoCompleteTextView;
import android.widget.ProgressBar;
import android.widget.Scroller;
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 click01(View view){
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("警告:");
        builder.setMessage("您将要执行点击操作,是否继续");
        builder.setPositiveButton("确定继续", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Toast.makeText(MainActivity.this,"继续执行",Toast.LENGTH_LONG).show();
            }
        });
        builder.setNegativeButton("确定取消", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Toast.makeText(MainActivity.this,"已退出执行",Toast.LENGTH_LONG).show();
            }
        });
        builder.create().show();
    }
	//单选对话框
    public void click02(View view) {
        AlertDialog.Builder buider = new AlertDialog.Builder(this);
        buider.setTitle("请选择您的性别");
        final String[] items = {"男","女","中性"};
        buider.setSingleChoiceItems(items, -1, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Toast.makeText(MainActivity.this,"您的性别是"+items[which],Toast.LENGTH_LONG).show();
            }
        });
        buider.setNegativeButton("取消选择",null);
        buider.create().show();
    }
	//多选对话框
    public  void click03(View view){
        AlertDialog.Builder buider = new AlertDialog.Builder(this);
        buider.setTitle("请选择您的爱好");
        final String[] items = {"读书","打球","看电视","玩游戏","睡觉"};
        final boolean[] checkItems = {true,false,false,false,false};
        buider.setMultiChoiceItems(items,checkItems, new DialogInterface.OnMultiChoiceClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which, boolean isChecked) {
                if(isChecked)
                    Toast.makeText(MainActivity.this,"您的爱好是"+items[which],Toast.LENGTH_LONG).show();
                checkItems[which] = isChecked;
            }
        });
        buider.setNegativeButton("取消选择",null);
        buider.create().show();
    }
	//进度条
    public void click04(View view){
        final ProgressDialog pd = new ProgressDialog(this);
        pd.setTitle("提醒:");
        pd.setMessage("正在努力加载...请稍后");
        pd.show();
        new Thread(){
            @Override
            public void run() {
                try {
                    Thread.sleep(6000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                pd.dismiss();
            }
        }.start();
    }
}

十.按钮绑定事件(重点)

方式一

<Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="绑定方式1"
        android:id="@+id/btn1"
        />

成员变量

private Button bnt1;

构造方法:

bnt1 = findViewById(R.id.btn1);
        bnt1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(MainActivity.this,"绑定方式1",Toast.LENGTH_SHORT).show();
            }
        });

方式二

<Button
        android:layout_below="@+id/btn1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="绑定方式2"
        android:onClick="click02"
        android:id="@+id/btn2"
        />

成员方法:

public void click02(View view){
        Toast.makeText(this, "绑定方式2", Toast.LENGTH_SHORT).show();
    }

方式三

<Button
        android:layout_below="@+id/btn2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="绑定方式3"
        android:id="@+id/btn3"
        />

构造方法

bnt3 = findViewById(R.id.btn3);
        bnt3.setOnClickListener(this);

成员方法

@Override
    public void onClick(View v) {
        if(R.id.btn3 == v.getId()){
            Toast.makeText(this, "绑定方式3", Toast.LENGTH_SHORT).show();
        }
    }

方法四

成员变量

private Button btn4;

构造方法

btn4 = findViewById(R.id.btn4);
        btn4.setOnClickListener(new MyOnclickListener());

class MyOnclickListener implements View.OnClickListener{
        @Override
        public void onClick(View v) {
            if(R.id.btn4 == v.getId())
                Toast.makeText(MainActivity2.this,"绑定方式4",Toast.LENGTH_SHORT).show();
        }
    }

十一.安卓下面有一个listview 怎么用它写一个列表

样式

<ListView
        android:id="@+id/lv"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </ListView>

oncreate()方法

ListView lv = findViewById(R.id.lv);
lv.setAdapter(new MyAdapt() );

自定义适配器

private class MyAdapt extends BaseAdapter{

        @Override
        public int getCount() {//条数
            return 20;
        }

        @Override
        public Object getItem(int position) {
            return null;
        }

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

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {//设置参数
            TextView tv = new TextView(MainActivity.this);
            tv.setText("列表");
            tv.setTextSize(28);
            return tv;
        }
    }

十二.ListView的优化原理,让其不报内存溢出错误(简答题)

ViewGroup复用

当你拖动列表时,这个getView方法一直在重复调用
其实这个getView方法它内部是非常耗资源的,大量的数据,如果频繁的执行此方法,很容易导致oom: out of memory:内存溢出

public View getView(int position, View convertView, ViewGroup parent) {
       TextView tv = null;

       if(convertView == null){
	  System.out.println("缓存view此时不存在:new TextView: "+position);
	  tv = new TextView(MainActivity.this);
       }else{
	  System.out.println("缓存view此时存在"+position);
          tv = (TextView)converView;
	}
	return tv;
	  
}

十三.Android通过XML进行C/S交互,解析XML交互,Android推荐使用哪一个

建议使用 XmlPullParser,这是一种在 Android 上解析 XML 的高效且可维护的方式。

十四.Logcat有什么用,怎么用(选择题)

Logcat 是一个命令行工具,用于转储系统消息日志,包括设备抛出错误时的堆栈轨迹,以及从您的应用使用 Log 类写入的消息。

Log.d("MainActivity","按钮被点击了");//debug调试 蓝色
Log.i();//information 绿色 不显示v d 显示 i w e信息
Log.e();//error 红色 错误信息
Log.v();//verbose啰嗦 输出任何信息 黑色
Log.wtf()//what a terrible failure 报告一个永远不会发生的bug
Log.w()//warning 警告 橙色

十五.Logcat分别代表什么级别的日志

Logcat 信息分为好几个级别,分别是:Assert(断言)、Debug(调试)、Error(错误)、Info(信息)、Verbose(详细)、Warning(警告)。

  1. [V]:详细(Verbose)信息,输出颜色为黑色 (我用白色)
  2. [D]:调试(Debug)信息,输出颜色是蓝色 (我用蓝色)
  3. [I]:通告(Info)信息,输出颜色为绿色 (我用绿色)
  4. [W]:警告(Warn)信息,输出颜色为橙色 (我用橙色)
  5. [E]:错误(Error)信息,输出颜色为红色,(我用淡红色)

这里错误信息的级别最高,其次是警告信息,然后是通知信息和调试信息,级别最低的是详细信息。

十六.Android提供的SQLite数据库的用法

主类:MainActivity

成员变量:

private EditText name;
    private RadioGroup sex;
    private StudentDao dao;
    private ListView lv;

构造方法

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        name = findViewById(R.id.name);
        sex = findViewById(R.id.sex);
        lv = findViewById(R.id.lv);

        /*MyDataBaseOpenHelper helper = new MyDataBaseOpenHelper(this, "student.db", null, 1);
        helper.getWritableDatabase();*/
        dao = new StudentDao(this);
        refreshData();
    }

保存数据

public void save(View view) {
        String names = name.getText().toString().trim();

        if (TextUtils.isEmpty(names)) {
            Toast.makeText(this, "请输入学生的姓名", Toast.LENGTH_LONG).show();
            return;
        }
        String sexs;
        int id = sex.getCheckedRadioButtonId();
        if (id == R.id.male) {
            sexs = "male";
        } else {
            sexs = "famale";
        }
        dao.add(names, sexs);
        Toast.makeText(this, "学生记录添加成功", Toast.LENGTH_SHORT).show();
        refreshData();

    }

显示数据


    private void refreshData() {
        final List<Student> students = dao.findAll();
        lv.setAdapter(new BaseAdapter() {
            @Override
            public int getCount() {
                return students.size();
            }

            @Override
            public Object getItem(int position) {
                return null;
            }

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

            @Override
            public View getView(int position, View convertView, ViewGroup parent) {

                //方法二 通过打气筒方式搞定
                //把一个布局文件,也就是我们刚才编写的item.xml文件转换为view对象
                View view;
                if(convertView == null){
                    view = View.inflate(MainActivity.this, R.layout.item, null);
                }else{
                    view = convertView;
                }
                //在view里面查找子控件
                TextView tv_name = view.findViewById(R.id.tv_name);
                ImageView iv_sex = view.findViewById(R.id.iv_sex);
                Student student = students.get(position);
                String sex = student.getSex();
                String name = student.getName();
                if("male".equals(sex)){
                    iv_sex.setImageResource(R.mipmap.nan);
                }else{
                    iv_sex.setImageResource(R.mipmap.nv);
                }
                tv_name.setText(name);
                view.findViewById(R.id.delete).setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        //删除操作
                        AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
                        builder.setTitle("提示:");
                        builder.setMessage("您将要执行删除操作,是否继续");
                        builder.setPositiveButton("确定继续", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                dao.delete(name);
                                Toast.makeText(MainActivity.this,"删除学生记录成功",Toast.LENGTH_SHORT).show();
                                refreshData();
                            }
                        });
                        builder.setNegativeButton("确定取消", null);
                        builder.create().show();



                    }
                });
                return view;

            }
        });
    }

数据库操作类


public class StudentDao {

     private MyDataBaseOpenHelper helper;

     public StudentDao(Context context){
         helper = new MyDataBaseOpenHelper(context,"student.db", null, 1);
     }

    /**
      添加一条学生记录
     * @param name 姓名
     * @param sex 性别
     */
     public void add(String name,String sex){
         SQLiteDatabase db = helper.getWritableDatabase();
         db.execSQL("insert into student (name,sex) values(?,?)",new Object[]{name,sex});
         db.close();
     }


    /**
     删除一条学生记录
     * @param name 姓名
     */
    public void delete(String name){
        SQLiteDatabase db = helper.getWritableDatabase();
        db.execSQL("delete from student where name=?",new Object[]{name});
        db.close();
    }


    /**
     修改一条学生记录
     * @param name 姓名
     */
   /* public void update(String name,String newPhone){
        SQLiteDatabase db = helper.getWritableDatabase();
        db.execSQL("update student set phone=? where name=?",new Object[]{newPhone,name});
        db.close();

    }*/


    /**
      查找的操作大家自己做  这是获取一条记录
     */

    /**

     获取全部的学生记录
     */
    public List<Student> findAll(){
        List<Student> students = new ArrayList<Student>();
        SQLiteDatabase db = helper.getReadableDatabase();
        Cursor cursor = db.rawQuery("select name,sex from student", null);
        while(cursor.moveToNext()){
            String name = cursor.getString(0);
            String sex = cursor.getString(1);
            Student student = new Student();
            student.setName(name);
            student.setSex(sex);
            students.add(student);
        }
        cursor.close();
        db.close();
        return students;

    }
}

创建数据库连接类

public class MyDataBaseOpenHelper extends SQLiteOpenHelper {
    /**
     *
     * @param context 上下文
     * @param name  数据库文件的名称
     * @param factory   默认游标工厂
     * @param version   数据库版本,默认从1开始,递增
     */
    public MyDataBaseOpenHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {
        super(context, "student.db", null, 1);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {

        Log.d("MyDataBaseOpenHelper","数据库 oncreate了");
        db.execSQL("create table student (_id integer primary key autoincrement,name varchar(20),sex varchar(30))");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

         Log.d("MyDataBaseOpenHelper","数据库更新了...");

   
    }
}

创建学生类

public class Student {

    private String name;
    private String sex;

    public String getName() {
        return name;
    }

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

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                '}';
    }
}

<?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"
    tools:context=".MainActivity">

    <EditText
        android:id="@+id/name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入学生姓名" />

    <TextView

        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="请选择学生的性别"
        android:textSize="18dp" />

    <RadioGroup
        android:id="@+id/sex"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <RadioButton
            android:id="@+id/male"
            android:layout_width="0dip"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:checked="true"
            android:text="男" />

        <RadioButton
            android:id="@+id/female"
            android:layout_width="0dip"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="女" />
    </RadioGroup>

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="save"
        android:text="保存" />

    <LinearLayout
        android:id="@+id/ll"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <ListView
            android:id="@+id/lv"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

    </LinearLayout>
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
    android:orientation="horizontal"
    android:layout_height="match_parent">

    <ImageView
        android:layout_width="28dp"
        android:layout_height="28dp"
        android:src="@mipmap/nv"
        android:id="@+id/iv_sex"
        />

    <TextView
        android:id="@+id/tv_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@+id/iv_sex"
        android:layout_marginLeft="20px"
        android:text="xxx"
        android:textSize="20dp" />

    <ImageView
        android:layout_width="28dp"
        android:layout_height="28dp"
        android:layout_alignParentRight="true"
        android:src="@mipmap/delete"
        android:id="@+id/delete"
        />

</RelativeLayout>

十七.SQLite数据库生命周期的onCreate() onUpgrade()

onCreate()

public abstract void onCreate (SQLiteDatabase db)

数据库第一次被创建时会调用

onUpgrade()

public abstract void onUpgrade (SQLiteDatabase db, 
                int oldVersion, 
                int newVersion)

当数据库需要更新的时候会被调用。实现应该使用该方法删除表,添加表或完成升级到新架构版本所需的其他任何操作。

十八.横屏与竖屏在Android下的切换

自适应横竖屏

AndriodManifest.xml

android:configChanges=“keyboardHidden|screenSize|orientation”

<activity android:name=".MainActivity"
            android:configChanges="keyboardHidden|screenSize|orientation">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

十九.清单文件的目录结构

AndroidManifest.xml 是整个应用的主配置清单文件,其内部有包名、版本号、组件、权限等信息内容。清单文件是用来记录应用相关的配置信息的。

  • 应用程序的包名,该包名将会作为该应用的唯一标识。
  • 应用程序所包含的组件,如Activity、Service、BroadcastReceiver和ContentProvider等。
  • 应用程序兼容的最低版本。
  • 应用程序使用系统所需的权限声明。
  • 其他程序访问该程序所需要的权限声明。

1.应用的包名以及版本信息的管理

package                        //包名android:versionCode="1";      //版本号android:versionName="1.0";     //版本名   

2.android 版本信息(可以支持的最低版本、期望的系统版本)

android:minSdkVersion="8"        //最低SDK版本android:targetSdkVersion="16"    //期望SDK版本

3.application 标签

一个清单文件只能包含一个 application 节点,application 可以设置图标(android:icon)、标题(android:label)、主题样式(android:theme)。

application 标签内可以包含各式各样的组件例如 Android 的四大组件 activity、service、contentprovider 和 broadcastreceiver 这样的标签容器,用来去指定应用程序的组件。

4.权限配置

(1)<uses-permission>申请权限

在安装程序的时候,你设定的所有权限将会告诉给用户,由他们来决定同意与否。对很多本地 Android 服务来说,权限都是必须的,特别是那些需要付费或者有安全问题的服务。

(2)自定义权限

自定义权限可以自定义命名,主要功能是用来保护 Android 的某些重要组件。

注意:每个组件都必须包含 Android:name 这个属性,推荐用全名称(包名.类名),intent-filter(过滤器)可以选写;

四大组件中除了 BroadcastReceiver 可以使用代码声明注册以外,其他组件必须要在 Manifest 文件中进行声明配置,否则会报错。

二十.安卓中的适配器怎么用

声明listprivate ListView sms_lv;

数组

 private ListView sms_lv;
 private String[] smsMessages = {"1、我喜欢你,喜欢的只是一个现在;我爱你,爱的却是一整个未来。如果是决定离开了一个人,那么你行动是要快一点,快刀斩乱麻;如果决定爱上一个人,时间要拉长一点,看清楚他是否真的适合你。",
            " 2、不需要海枯石烂的山盟海誓,只需一生一世的默默相守;不需要多么奢华的烛光晚餐,只需两个人,一桌粗茶淡饭;不需要有座别墅,面朝大海,春暖花开,只需一套小小房子,落地窗,一米阳光。这就是爱,平淡却幸福着;这就是爱,简单并快乐着。",
            "3、心理学家发现:一个人说的话若90%以上是废话,他就快乐。若废话不足50%,快乐感则不足。在交流中,没有太强目的性的语言,更容易让人亲近。----所以,我们每天都在找“幸福”。幸福是什么呢?大概就是找到了一个愿意听你说废话的人。",
            "4、大龄女青年的爱情宣言:夏天来了,秋天还会远么,找个男朋友然后挖个坑埋了,等到秋天长出好多好多个男朋友,一个揉肩、一个捶腿、一个做饭、一个哼小曲、一个收拾房子、一个陪我逛街、剩下的全都出去挣钱。",
            "5、朋友们,在确认她成为你女朋友之前,先带她去游泳吧,有3个好处。1、看身材,没有过多的衣服,藏也藏不住。2、看素颜,在水里,什么遮瑕膏粉底霜,都将不复存在。3、等她学会了游泳,就不会问,你妈和我一起落水,你先救谁的问题了……",
            "6、有时候特想谈恋爱,但一想到“我皮肤不好,他要是亲我会看到的,他搂我腰会发现我隐藏的肥肉了,一起吃饭就知道我饭量像个汉子,捧个手机刷微博哈哈哈哈傻笑他会觉得我是神经病吧”我就觉着还是单身好。不过想着我有这么多毛病根本就找不到对象,也就释然了。",
            "7、【一个结婚10年的男人的总结】1、在心爱的女人面前,越贱越快乐;2、在她洗澡的时候悄悄帮她把拖鞋换个方向;3、副驾驶的位子是老婆的专座;4、不要以为沉默很酷,两个人在一起还是要多沟通比较好。",
            "8、土豆和西红柿走到了一起。因为土豆变成了薯条,西红柿变成了番茄酱,它俩变成了绝配。感情亦是如此,懂得欣赏与珍惜,才能看得到长久!"};

oncreate添加适配器

 sms_lv = findViewById(R.id.sms_lv);
 sms_lv.setAdapter(new ArrayAdapter<String>(this,R.layout.item,smsMessages));//item布局,smsMessages内容

R.layout.item不能乱写,要有控件.阔以这样(把布局什么的直接去掉只留下一个文本框)

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:textSize="15sp"
    android:layout_height="wrap_content">
</TextView>

增加点击事件

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sms_list);
        sms_lv = findViewById(R.id.sms_lv);
        sms_lv.setAdapter(new ArrayAdapter<String>(this,R.layout.item,smsMessages));

        sms_lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            //当listview的条目被点击的时候调用的方法
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
                System.out.println("position:"+position);
                String message = smsMessages[position];
		//开启新的Activity并且获取返回值
               /* Intent intent = new Intent(SmsListActivity.this,MainActivity.class);
                intent.putExtra("message",message);
                startActivity(intent);*/
                //把当前界面的数据,返回给开启我的界面
                Intent data = new Intent();
                data.putExtra("message",message);
                setResult(0,data);
                //把当前界面关闭
                finish();

            }
        });
    }

获取界面

public class MainActivity extends AppCompatActivity {

    private EditText et_message;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        et_message = findViewById(R.id.et_message);
        Intent intent = getIntent();
        String message = intent.getStringExtra("message");
        et_message.setText(message);
    }

    public void selectSmsContent(View view) {
        //开启新的Activity并且获取返回值
        Intent intent = new Intent(this,SmsListActivity.class);
        //startActivity(intent);
        startActivityForResult(intent,0);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        System.out.println("我们开启的新的界面被关闭了,结果的数据返回到这里了");
        //Toast.makeText(this,"我们开启的新的界面被关闭了,结果的数据返回到这里了",Toast.LENGTH_LONG).show();
        if(data != null){
            String message = data.getStringExtra("message");
            et_message.setText(message);
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Andriod期末复习总结 的相关文章

  • 书摘】程序员成长的10个阶段

    导读 本文节选自机械工业出版社 程序员成长路线图 一书 该书的作者N216 张磊和吉阳一起回忆和总结了自己几十年的程序员成长经历 对当前程序员关心的热点 重点 难点问题给出了自己的看法和建议 通过对程序员的成长阶段进行划分 使得各个阶段的程
  • 什么是Java的跨平台性?原理是什么?

    所谓跨平台性 是指java语言编写的程序 一次编译后 可以在多个系统平台上 运行 实现原理 Java程序是通过java虚拟机在系统平台上运行的 只要该系统可以安 装相应的java虚拟机 该系统就可以运行java程序 机器码再上CPU运行 什
  • 《工程伦理与学术道德》之《工程活动中的环境伦理》

    工程伦理与学术道德 之 工程活动中的环境伦理 工程活动中的环境伦理 4 1 工程活动中环境伦理观念的确立 4 1 1 工业化过程中保护环境的两种思路 4 1 2 工程环境伦理的基本思想 4 1 3 工程环境伦理的核心问题 4 2 工程活动中
  • 22. 面向对象 - 高阶

    Hi 大家好 我是茶桁 之前的课程里面 我们简单的接触了面向对象编程 也和大家讲解了其思想 优缺点 相信上节课程结束之后 大家对面向对象都有了一定的理解 那么我们这节课 就进入面向对象的一些高阶部分 让我们继续来学习一些魔术方法以及Pyth
  • redis mysql_redis和mysql的结合示例

    mysql和redis的区别 mysql是关系型数据库 主要用于存放持久化数据 将数据存储在硬盘中 读取速度较慢 redis是非关系型数据库 即将数据存储在缓存中 缓存的读取速度快 能够大大的提高运行效率 但是保存时间有限 django中使
  • 【python】if __name__==‘__mian__‘ 如何理解,原理及作用

    1 什么是 name 1 为什么使用 name 属性 Python解释器在导入模块时 会将模块中没有缩进的代码全部执行一遍 模块就是一个独立的Python文件 开发人员通常会在模块下方增加一些测试代码 为了避免这些测试代码在模块被导入后执行
  • 【Flutter 1-14】Flutter手把手教程Dart语言——Dart语言引用、import、package使用

    作者 弗拉德 来源 弗拉德 公众号 fulade me 库 import 关键字可以帮助你创建一个模块化和可共享的代码库 代码库不仅只是提供 API 而且还起到了封装的作用 以下划线 开头的成员仅在代码库中可见 使用库 使用import来指
  • 对数学期望、方差、协方差、协方差矩阵的理解

    参考 概率论与数理统计 浙大 关键词 数学期望 数学期望的性质 方差 标准差 方差的性质 协方差 相关系数 协方差矩阵 数学期望 变量分布的中心 数学期望也叫期望 或者均值 E X 完全由X的概率分布决定 若X服从某一分布 也成E X 是该
  • [总结]音视频基础知识·一

    目前状态 音视频领域知识零基础 已经掌握理论或技能 1 数学 高等数学 概率论与数理统计 线性代数 2 计算机 计算机操作系统原理 计算机网络 C C 语言 3 信号处理 数字信号处理 信号与系统 4 嵌入式 单片机原理与应用 Linux基
  • 35. Search Insert Position(二分查找加插入下标)

    题目 Given a sorted array and a target value return the index if the target is found If not return the index where it woul
  • IDEA查看类的继承关系图形技巧,你学会了吗?

    最近正好也没什么可忙的 就回过头来鼓捣过去的知识点 到Servlet部分时 以前学习的时候硬是把从上到下的继承关系和接口实现记得乱七八糟 这次利用了IDEA的diagram 结果一目了然 也是好用到炸裂 就此分享 1 查看图形形式的继承链
  • 【Java】企业微信群机器人发送消息(文字、图片、MarkDown、文件消息)

    Java调用企业微信群机器人发送消息 2022 4 22更新 新增可发送文件消息 发送文件消息需要先将文件上传到企业微信的临时素材 url为https qyapi weixin qq com cgi bin webhook upload m
  • 项目打包部署之部署jar包和war包

    一 概述 本文将介绍将Java项目部署到Linux服务器上的步骤 首先 你需要了解服务器的基本知识和安装Java环境的方法 然后 我们就jar包和war包两种应用部署到Linux服务器上来进行讲解 包括如何将应用程序上传到服务器 如何配置服
  • keil编译错误 "Please select first the target STM32F10x...

    keil编译STM32工程时 error directive Please select first the target STM32F10x device used in your application in stm32f10x h f

随机推荐

  • 基于OpenCV的垃圾分类项目的C++代码详解——学习笔记(三)

    基于OpenCV C 垃圾分类项目的代码详解 工训总结 对分类结果进行简单的界面显示 Begining 今天给大家介绍一个简单写界面的代码 一 问题描述 1 当我们在做工程的时候经常需要一个简单的图形化用户界面来显示工程内部的变量信息 这个
  • JVM--基础--27.4--工具--MemoryAnalyzer--介绍、安装

    JVM 基础 27 4 工具 MemoryAnalyzer 介绍 安装 1 介绍 Memory Analyzer 是一个跨平台的开源工具 可以用它来分析内存问题 可以用来监控整个 Java 应用程序的状态和行为 1 1 我使用Memory
  • Java:Map转List (用stream实现)

    例子 Map
  • Swift学习之 - 访问控制权限(fileprivate,private,internal,public,open)

    先来看下小白的错误代码 import UIKit class ViewController UIViewController override func viewDidLoad super viewDidLoad text extensio
  • 批量修改文件名 最简单的实现python os

    import os def name file dir r C Users Administrator Desktop 车牌 a os listdir file dir for i in a os rename i i png i为原名 p
  • 算法训练营第二十二天(8.4)

    LeeCode77 Combinations 题目地址 力扣 题目类型 回溯 组合 不用排序 class Solution private vector
  • Acwing-877. 扩展欧几里得算法

    include
  • 国家地区语言缩写码

    国家地区语言缩写码 语言 国家 地区 语言代码 国家 地区 语言代码 简体中文 中国 zh cn 繁体中文 台湾地区 zh tw 繁体中文 香港 zh hk 英语 香港 en hk 英语 美国 en us 英语 英国 en gb 英语 全球
  • 宝塔一键配置https

    下面是宝塔的说明 注意Apache的坑 证书文件目录 大部分免费证书 指阿里 腾讯申请的 都会有以下四个文件夹 面板只需要用到nginx或apache的 其他无需理会 Nginx环境配置证书方法 证书目录只有两个文件的 进入nginx 证书
  • 【技术分享】Lombok!代码简洁神器还是代码“亚健康”元凶?

    如果您正在阅读此文 想必您对Project Lombok已经有了一段时间的了解 您是否正准备拥抱Lombok 还是正准备将如此酷炫的项目推荐给你的团队 如果您准备那么做 不妨听听我在使用Lombok一年后的一些感受 我承认 Lombok是一
  • # C++网络请求(get,post,上传图片)与QML混合编程

    C 网络请求 get post 上传图片 与QML混合编程 文章主要分两个大模块 C 模块和qml模块 包含了Qt下网络请求QNetworkAccessManager QNetworkRequest QNetworkReply类库 以及响应
  • vue中实现锚点定位平滑滚动

    下面是简单的代码 拿来即用 html 给div盒子设定单击事件和ref名 div 点击滑动到此位置 div methods getThere 通过ref名获取元素在页面中的位置并滚动至此 this el querySelector cat
  • Unity3D中打包WEBGL后读取本地文件数据+网络请求

    PS 博主在上编文章中写道webgl读取本地文件数据以及内部网络请求 在这里详细补充一下 首先上一编博主运行html之后报的错误 提示内存不足 1 首先排查一下webgl包的大小 不能超过2G 2 F12查看具体错误 在这里博主的是 a 本
  • AWS Kubernetes Ingress nginx websocket 代理

    在需要配置WebSocket的Ingress服务上增加下面注解 metadata annotations nginx org websocket services SERVICE NAME WebSocket 测试 ws test yaml
  • JSON 按key的字符先后顺序排序

    话不多说直接上方法 var sortJson function obj callback var endValue item key keyArray keyArray2 o i len endValue keyArray keyArray
  • 一元线性回归分析的残差诊断

    1973年安斯库姆 Anscombe 构造了四组数据 用这四组数据得到的经验回归方程是相同的 都是y 3 00 0 500x 决定系数都是 r2 0 667 相关系数r 0 816 这四组数据所建的回归方程是相同的 决定系数r2 F统计量也
  • uboot中printf( )函数实现分析

    1 前言 这部分涉及uboot中串口的初始化 参考博客 uboot中串口 控制台 初始化详解 2 printf 函数实现思路分析 1 uboot中的printf 函数的用法和利用C库编写C语言程序时是一样的 本身uboot中printf 函
  • linux中的/etc/hosts.allow和/etc/hosts.deny详解

    linux中的 etc hosts allow和 etc hosts deny详解 当linux主机需要允许 禁止某些ip地址 地址段访问某些资源或服务时 etc hosts allow和 etc hosts deny就派上了用场 两个文件
  • tcp_transmit_skb的发送时机梳理

    在上文数据通过网络发送的过程中 当程序调用tcp sendmsg发送数据的时候有可能当前的数据不会马上发送出去 当前在哪些场景下会触发数据的发送呢 检查mtu 创建 一个新的路径MTU 发现段 未启用路径MTU 当前路径MTU探测段的长度不
  • Andriod期末复习总结

    一 安卓项目的目录结构 AndroidManifest xml 项目清单文件 设置应用名称 图标等属性 libs 项目依赖的外部库 src Java源文件 bin 目标文件 Java字节码 class 资源打包文件 ap 和Dalvik虚拟