【第一行代码】Chapter2

简介

这一个项目的代码包含了书中第二章的代码。其中包括:
添加菜单功能,活动间切换,传输数据,调用接口例如搜索,打电话,活动管理,查看当前界面所属活动

项目目录列表

这个项目列表是我在阅读书本的时候,把第二章的很多内容都写在一起了的结果
在这里插入图片描述

成果展示

在这里插入图片描述在这里插入图片描述在这里插入图片描述

关键代码

在书中事件的触发一般都是利用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();

项目源码下载

CSDN下载地址

github

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值