AndroidManifest.xml,项目清单文件,设置应用名称、图标等属性。
libs:项目依赖的外部库
src:Java源文件
bin:目标文件,Java字节码(.class)、资源打包文件(.ap_)和Dalvik虚拟机的可执行文件(*.dex)
gen:R.java文件
res:
layout:XML布局文件
values:多种XML文件
drawable_ldpi,
drawable_mdpi,
drawable_hdpi,
drawable_xhdpi`这四个子目录分别存放低分辨率、中分辨率、高分辨率、超高分辨率的4种图片文件
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 指定)的位置。因此,您可以按照右边框对齐两个元素,或者使它们一上一下,屏幕居中,左侧居中,等等。默认情况下,所有子视图均绘制在布局的左上角,因此您必须使用中提供的各种布局属性定义每个视图的位置。
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 被杀掉以后或者被启动以前。
(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);
监听器
(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);
}
隐式意图需要过滤器
(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的作⽤:启动活动、启动服务、发送⼴播等
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();
}
}
成员变量
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();
}
});
成员方法:
public void click02(View view){
Toast.makeText(this, "绑定方式2", Toast.LENGTH_SHORT).show();
}
构造方法
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
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;
}
}
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;
}
建议使用 XmlPullParser
,这是一种在 Android 上解析 XML 的高效且可维护的方式。
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 信息分为好几个级别,分别是:Assert(断言)、Debug(调试)、Error(错误)、Info(信息)、Verbose(详细)、Warning(警告)。
这里错误信息的级别最高,其次是警告信息,然后是通知信息和调试信息,级别最低的是详细信息。
主类: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 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 findAll(){
List students = new ArrayList();
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 + '\'' +
'}';
}
}
onCreate()
onUpgrade()
onCreate()
public abstract void onCreate (SQLiteDatabase db)
数据库第一次被创建时会调用
onUpgrade()
public abstract void onUpgrade (SQLiteDatabase db,
int oldVersion,
int newVersion)
当数据库需要更新的时候会被调用。实现应该使用该方法删除表,添加表或完成升级到新架构版本所需的其他任何操作。
自适应横竖屏
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 是整个应用的主配置清单文件,其内部有包名、版本号、组件、权限等信息内容。清单文件是用来记录应用相关的配置信息的。
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)
在安装程序的时候,你设定的所有权限将会告诉给用户,由他们来决定同意与否。对很多本地 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(this,R.layout.item,smsMessages));//item布局,smsMessages内容
R.layout.item
不能乱写,要有控件.阔以这样(把布局什么的直接去掉只留下一个文本框)
增加点击事件
@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(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);
}
}
}