简介
这一个项目的代码包含了书中第二章的代码。其中包括:
添加菜单功能,活动间切换,传输数据,调用接口例如搜索,打电话,活动管理,查看当前界面所属活动
项目目录列表
这个项目列表是我在阅读书本的时候,把第二章的很多内容都写在一起了的结果
成果展示
关键代码
在书中事件的触发一般都是利用toast来实现
除了利用toast,更一般的是利用log输出
当然toast面对用户,log面对开发人员
使用Toast
第一个参数是当前context
第二个参数是输出文本string
第三个参数是停留时间
不要忘记在后面加上 .show()
Toast.makeText(FirstActivity.this, "remove", Toast.LENGTH_SHORT).show();
添加菜单
//第一步:新建菜单布局文件
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/add_item"
android:title="Add"/>
<item
android:id="@+id/remove_item"
android:title="Remove"/>
</menu>
//第二步:重写onCreateOptionsMenu()方法获得菜单布局文件
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main,menu);
return true;
}
//第三步:重写onOptionsItemSelected()方法为菜单栏设置点击触发事件
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.add_item:
Toast.makeText(this, "add", Toast.LENGTH_SHORT).show();
break;
case R.id.remove_item:
Toast.makeText(this, "remove", Toast.LENGTH_SHORT).show();
break;
default:
}
return true;
}
活动间切换,一般的操作流程:
添加触发条件: 书中是以按钮的点击为触发条件
利用Intent启动新活动: 分为 显式Intent 和 隐式Intent
显式Intent
第一个参数是当前context
第二个参数是要跳转的context
Intent intent1 = new Intent(FirstActivity.this,SecondActivity.class);
startActivity(intent1);
隐式Intent
首先在打开AndroidManifest.xml
配置第二个活动,在中设置
“action android:name"和"category android:name”
当和中的内容同时匹配上Intent中指定的和时,这个活动才能够响应
android.intent.category.DEFAULT是一种默认的category,在调用startActivity()会自动将这个category添加到Intent中
Intent参数是要跳转的活动的
<activity
android:name=".SecondActivity">
<intent-filter>
<action android:name="com.example.chapter2.ACTION_START" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
Intent intent1 = new Intent("com.example.activitytest.ACTION_START");
startActivity(intent1);
隐式Intent的扩展用法
//打开浏览器
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);
//打开拨号盘
Intent intent = new Intent(Intent.ACTION_DIAL);
intent.setData(Uri.parse("tel:10086"));
startActivity(intent);
活动的启动方式已经了解,现在来实现向下一个活动传递数据功能
利用Intent的putExtra()方法就可以实现
具体步骤:
新建Intent
存入数据
启动活动
在启动的新活动中取出数据
//FirstActivity.java
Intent intent1 = new Intent(FirstActivity.this,SecondActivity.class);
string data = "Hello world!";
intent1.putExtra("extra_data", data);
startActivity(intent1);
//SecondActivity.java
Intent intent = getIntent();
string data = intent.getStringExtra("extra_data");
返回数据给上一个活动
有两种方式
way1:
直接新建一个活动传输数据,和上面的操作一样.
way2:
在刚开始新建活动的时候,启用返回数据的启动方式
在新活动中配置触发条件,返回数据
//第一步:FirstActivity.java 启动有返回结果的方式启动新活动
Intent intent1 = new Intent(FirstActivity.this,SecondActivity.class);
startActivityForResult(intent1, 1);
//第二步:SecondActivity.java 设置触发条件,点击按钮 或者 重写回退键onBackPressed()方法
Intent intent = new Intent();
intent.putExtra("data_return", "Hello First");
setResult(RESULT_OK, intent);
finish();
/*
第三步:FirstActivity.java 重写onActivityResult()方法
注意到requestCode, resultCode, data这三个参数
requestCode 请求码,判断数据的来源 startActivityForResult(intent1, 1); 中的1
resultCode 处理结果,一般只使用RESULT_OK或者RESULT_CANCELED
data 携带返回数据的Intent,通过标签 data_return 活动真正的字符串数据 Hello First
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
switch (requestCode) {
case 1:
if(resultCode == RESULT_OK) {
Toast.makeText(this,data.getStringExtra("data_return"),Toast.LENGTH_SHORT).show();
}
break;
default:
}
super.onActivityResult(requestCode,resultCode,data);
}
查看当前界面所属的活动
只需新建一个Java文件 命名为BaseActivity 不需要在AndroidManifest.xml注册
继承AppCompatActivity类,重写onCreate()方法
最后让所有的活动都继承BaseActivity
//getClass().getSimpleName() 获取当前实例的类名
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG, getClass().getSimpleName());
}
管理活动,更加快捷方便的退出程序
新建一个ActivityCollector类对所有的活动进行管理
创建一个活动列表,对列表进行增加,删除一个和删除全部的操作
在活动创建的时候增加
在活动销毁的时候删除一个
退出程序的时候删除全部
//第一步,新建ActivityCollector类
public class ActivityCollector {
public static List<Activity> activities = new ArrayList<>();
public static void addActivity(Activity activity) {
activities.add(activity);
}
public static void removeActivity(Activity activity) {
activities.remove(activity);
}
public static void finishAll() {
for(Activity activity : activities) {
if(!activity.isFinishing()) {
activity.finish();
}
}
}
}
//第二步,在我们之前创建的BaseActivity中重写 onCreate() 和 onDestory() 方法
public class BaseActivity extends AppCompatActivity {
private static final String TAG = "BaseActivity";
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG, getClass().getSimpleName());
ActivityCollector.addActivity(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
ActivityCollector.removeActivity(this);
}
}
//第三步: 设置触发条件,只需要一句或即可删除全部活动退出程序
ActivityCollector.finishAll();