1.基本用法

1.创建活动

Generate LayoutFile 创建布局文件

Launcher Activity 自动注册为主活动

编写顺序

  1. 活动Activity
  2. 注册.xml
  3. 界面res.xx

2.Toast使用

Activity中:

  Button button1 = findViewById(R.id.button_1);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(FirstActivity.this,"you clicked Button 1", Toast.LENGTH_SHORT).show(); // 使用方法:Toast.makeText(上下文,文本,时长).show
}
});

res.Layout中:

  <Button
android:id="@+id/button_1"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:text="Toast使用"
/>

3.Menu使用

Activity中:

 /**
* 活动上添加menu菜单
* @param menu
* @return
*/
@Override
public boolean **onCreateOptionsMenu**(Menu menu) { // 重写该方法启动menu
getMenuInflater().inflate(R.menu.main,menu);
return true;
} /**
* 给menu菜单添加功能
* @param item
* @return
*/
@Override
public boolean **onOptionsItemSelected**(@NonNull MenuItem item) { // 将menu中的菜单栏配上事件
// 判断添加那个菜单项
switch (item.getItemId()) {
case R.id.add_item:
Toast.makeText(this,"you clicked Add", Toast.LENGTH_SHORT).show();
break; case R.id.remove_item:
Toast.makeText(this,"you clicked Remove", Toast.LENGTH_SHORT).show();
break; default:
}
return true;
}

res.menu中:

  <item
android:id="@+id/add_item"
android:title="Add"
></item>
<item
android:id="@+id/remove_item"
android:title="Remove"
></item>

2.活动穿梭

Intent显示传递

Activity中:

  Button button3 = findViewById(R.id.button_3);
button3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(FirstActivity.this, SecondActivity.class); // 显示传送(开头,结尾)
startActivity(intent);
}
});

Intent隐示传递

Activity中:

   Button button4 = findViewById(R.id.button_4);
button4.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("com.example.activitytest.ACTION_START"); // 隐式传送(结尾)
intent.addCategory("com.example.activitytest.MY_CATEGORY");
startActivity(intent); Intent intent = new Intent(Intent.ACTION_VIEW); // 跳转百度
intent.setData(Uri.parse("http://baidu.com"));
startActivity(intent); Intent intent1 = new Intent(Intent.ACTION_DIAL); // 跳转拨号
intent1.setData(Uri.parse("tel:10086"));
startActivity(intent1);
}
});

.xml中配置:

  <activity android:name=".SecondActivity" android:label="second page">
<intent-filter>
<action android:name="com.example.activitytest.ACTION_START" /> // 自定义action,跳转时需要访问
<category android:name="android.intent.category.DEFAULT" /> // 默认category,跳转时不需要编写
<category android:name="com.example.activitytest.MY_CATEGORY" /> // 自定义category,跳转时需要访问
</intent-filter>
</activity>

信息的向上传递

第一个Activity中开启传送并接收:

  Button button6 = findViewById(R.id.button_6);
button6.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(FirstActivity.this, ThirdActivity.class);
startActivityForResult(intent, 1);
}
}); /**
* 接收上传数据
* @param requestCode
* @param resultCode
* @param data
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
switch (requestCode) {
case 1:
if(resultCode == RESULT_OK) {
String ResultData = data.getStringExtra("data_result");
Log.d("FirstActivity", ResultData);
}
break;
default:
}
}

第二个Acticity中接收发送数据:

   Button button = findViewById(R.id.button_t1);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.putExtra("data_result","hello,firstActivity");
setResult(RESULT_OK,intent);
finish();
}
}); @Override
public void **onBackPressed()** {
Intent intent = new Intent();
intent.putExtra("data_result","hello,back!");
setResult(RESULT_OK,intent);
finish();
}

信息的向下传递

第一个Activity中传送:

   Button button5 = findViewById(R.id.button_5);
button5.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String data = "hello secondActivity";
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra("extra_data",data);
startActivity(intent);
}
});

第二个Activity中接收:

    Intent intent = getIntent();
String data = intent.getStringExtra("extra_data");
Log.d("SecondActivity", data);

3.活动生命周期

4.活动启动

更改.xml文件中的属性

  <activity
android:name=".MainActivity"
android:label="主页"
android:launchMode="standard"> //更改属性,修改启动项********
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
名称 作用
默认 每次启动都创建一个新的活动
singleTop 可以防止自启动创建新的,但是其他活动启动,任然创建新的活动
singleTask 检查是否存在该活动,已经存在直接用。不存在,创建新的活动
singleInstance 新创建一个返回栈使用该活动

5.活动实践

1.检测运行的活动

编写BaseActivity类继承AppCompatActivity,其他活动继承该类,启动时打印出运行的活动名称:

 public class BaseActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("BaseActivity", getClass().getSimpleName()); // 检测运行的活动名称
}
}

2.统一销毁活动

编写活动管理器

  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中运行:

  public class BaseActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityCollector.addActivity(this); // 将活动放入管理器
} @Override
protected void onDestroy() {
super.onDestroy();
ActivityCollector.removeActivity(this); //将活动在管理器中移除
}
}

之后就可以在继承了BaseActivity的活动中统一销毁所有的活动,退回界面了:

    Button button1 = findViewById(R.id.buttonf1);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ActivityCollector.finishAll(); // 退出活动
android.os.Process.killProcess(android.os.Process.myPid()); // 杀掉一个进程
}
});

3.最佳启动活动

对于需要参数访问的活动,最好建立一个actionStart()来时外界访问比较方便:

  public static void actionStart(Context context,String data1,String data2) {
Intent intent = new Intent(context, 自己的名称.class);
intent.putExtra("data1",data1);
intent.putExtra("data2",data2);
context.startActivity(intent);
}

Unit2:活动的更多相关文章

  1. Xamarin.Android活动的生命周期

    一.前言 用过Android手机的人一定会发现一种现象,当你把一个应用置于后台后,一段时间之后在打开就会发现应用重新打开了,但是之前的相关的数据却没有丢失.可以看出app的“生命”是掌握在系统手上的, ...

  2. SQL Saturday 北京将于7月25日举办线下活动,欢迎参加

          地点:北京微软(中国)有限公司[望京利星行],三层308室     报名地址:https://onedrive.live.com/redir?page=survey&resid=f ...

  3. Redis简单案例(三) 连续登陆活动的简单实现

    连续登陆活动,或许大家都不会陌生,简单理解就是用户连续登陆了多少天之后,系统就会送一些礼品给相应的用户.最常见的 莫过于游戏和商城这些.游戏就送游戏币之类的东西,商城就送一些礼券.正值国庆,应该也有不 ...

  4. 51Nod 1428 活动安排问题

    51Nod   1428  活动安排问题 Link: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1428 1428 活 ...

  5. 用rose画UML图(用例图,活动图)

    用rose画UML图(用例图,活动图) 首先,安装rose2003,电脑从win8升到win10以后,发现win10并不支持rose2003的安装,换了rose2007以后,发现也不可以. 解决途径: ...

  6. 如何查看/统计当前AD域控制器的活动用户?

    最近公司想知道某台AD域控制器上当前连接了多少活动用户? 此前个人只知道以下不是非常完善且统计起来比较麻烦的方法: 方法1:查看共享会话数.(不完全准确) 方法2:查看当前的DNS记录.(这种方法统计 ...

  7. 初次启动app校验的活动图和分析

    初次启动活动图 version 1 version 2 version 3 根据上图的活动图分析,可能存在较严重的问题: 主线程中如果发现是sdcard的url,则可能进行重命名 FirstEnter ...

  8. C语言 活动安排问题之二

    有若干个活动,第i个开始时间和结束时间是[Si,fi),活动之间不能交叠,要把活动都安排完,至少需要几个教室? #include <stdio.h> #include <string ...

  9. C语言 活动安排问题

    有若干个活动,第i个开始时间和结束时间是[Si,fi),只有一个教室,活动之间不能交叠,求最多安排多少个活动? #include <stdio.h> #include <stdlib ...

随机推荐

  1. oracle中表加锁死锁的现象、原因及解决方案

    一.表加锁.死锁出现的现象 1.对数据库操作update.insert.delete时候,数据库无法更新,操作等待时长,操作结果不发生改变: 2.在程序中,底层(数据访问层)操作时候不成功,数据库连接 ...

  2. action中return returnSuccess()

    1.action中return  returnSuccess() 作用是什么?

  3. 【NOI2015】 软件包管理器 - 树链剖分

    noi2015 软件包管理器 Description Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软 ...

  4. python字典的增删改查

    字典dict 知识点: {}括起来,以键值对形式存储的容器性数据类型: 键-必须是不可变数据类型,且是唯一的: -值可以是任意数据类型.对象. 优点:关联性强,查询速度快. 缺点:以空间换时间. 字典 ...

  5. Spring注解驱动开发02(作用域和懒加载)

    Spring中bean的作用域 默认情况下,Spring只为每个在IOC容器里声明的bean创建唯一一个实例,整个IOC容器范围内都能共享该实例:所有后续的getBean()调用和bean引用都将返回 ...

  6. latex:公式环境

    1.单行公式环境 equation 单行公式环境equation可将一个公式,不管多长都可排版为一行,并给出一个序号.而由系统提供的displaymath环境等效于公式宏包提供的equation*环境 ...

  7. 接口测试 Mock 实战 | 结合 jq 完成批量化的手工 Mock

    本文霍格沃兹测试学院学员学习实践笔记. 一.应用背景 因为本章的内容是使用jq工具配合完成,因此在开始部分会先花一定的篇幅介绍jq机器使用,如果读者已经熟悉jq,可以直接跳过这部分. 先来看应用场景, ...

  8. Java高级特性——反射机制(第二篇)

    在Java高级特性——反射机制(第一篇)中,写了很多反射的实例,可能对于Class的了解还是有点迷糊,那么我们试着从内存角度去分析一下. Java内存 从上图可以看出,Java将内存分为堆.栈.方法区 ...

  9. C++入门记-构造函数和析构函数

    前文回顾 本文档环境基于Vscode + GCC + CodeRunner 关于C++的环境搭建请参考下面链接: C++入门记-大纲 由于本人具有C#开发经验,部分相同的知识就不再赘述了.只列一下需要 ...

  10. Event loop详解(包含Node端)

    Event loop事件循环,是一个执行模型.不同的浏览器以及Nodejs里的具体实现是不一样的. 一,浏览器端: HTML5规范里有明确定义,简单的说: 1,JS是单线程的,执行的时候在一条主栈上: ...