前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Activity

Activity

作者头像
佛系编码
发布2018-05-22 11:45:07
9420
发布2018-05-22 11:45:07
举报
文章被收录于专栏:Android学习之路

Activity

  • 什么是Activity
  • 创建Activity
  • 启动Activity
  • 保存Activity状态
  • Activity的生命周期

acitivyt 是什么

引用官方的说法: 是一个应用组件,用户可与其提供的屏幕进行交互,以执行拨打电话、拍摄照片、发送电子邮件或查看地图等操作。 每个 Activity 都会获得一个用于绘制其用户界面的窗口。窗口通常会充满屏幕,但也可小于屏幕并浮动在其他窗口之上

创建Activity

要创建Activity 必须继承自Activity或者Activity的子类。在Activity的各个生命阶段实现对应的方法;

其中重要的两个方法: onCreate() ,系统在创建Activity时调用此方法;在此方法实现视图绑定;一些 控件的初始化 onPuase(); 用户离开当前Activity调用的第一个方法 , 创建完成后必须在Manifest文件中 声明此Activity 系统才会知道有这个Activity

代码语言:javascript
复制
<manifest ... >
  <application ... >
      <activity android:name=".ExampleActivity" />
      ...
  </application ... >
  ...
</manifest >

如果有需要也可以为此Activity添加IntentFilter(IntentFilter稍后我会再做总结),以供外部程序来启动,一般同一应用中不会用到隐式启动。

代码语言:javascript
复制
<activity android:name=".AActivity">
    <intent-filter>
    <action android:name="com.skymxc.action.x1" />
    <action android:name="com.skymxc.action.x2" />

    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="com.skymxc.catagory.c1" />
    <category android:name="com.skymxc.catagory.c2" />

    <data android:scheme="http" />
    </intent-filter>
</activity>

最简单的Activity 只绑定了一个视图

代码语言:javascript
复制
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

启动Activity

可以通过一个intent 来启动 一个Activity ,关于intent稍后会做总结

明确目标启动

在明确的指导要启动的Activity的时候可以显示使用intent来启动

代码语言:javascript
复制
Intent intent = new Intent(this, SignInActivity.class);
startActivity(intent);

传递数据

如果需要传递数据,可以在intent中放入数据

代码语言:javascript
复制
Intent intent = new Intent(Intent.ACTION_SEND);
intent.putExtra("origin", "哈哈");
startActivity(intent);

获取数据

代码语言:javascript
复制
Intent intent = getIntent();//获取启动此activity的intent
String origin = intent.getStringExtra("origin");

不明确启动目标

在不明确要启动的Activity的时候 可以在intent中添加关于启动目标的描述和类型,系统会过滤所有的Activity的intentFilter来匹配 ;一般 在同一个应用中不必使用隐式Intent;

例如 我在为A Activity添加这样的IntentFilter:

代码语言:javascript
复制
<activity android:name=".AActivity">
    <intent-filter>
    <action android:name="com.skymxc.action.x1" />
    <action android:name="com.skymxc.action.x2" />

    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="com.skymxc.catagory.c1" />
    <category android:name="com.skymxc.catagory.c2" />

    <data android:scheme="http" />
    </intent-filter>
</activity>

要启动上面的Activity可以这样写

代码语言:javascript
复制
Intent in = new Intent();
////要执行的动作的描述 所有的action中 有一个匹配行
in.setAction("com.skymxc.action.x2");
//附加信息的描述 这里的描述只要在intentFilter中声明了就能匹配上,
// 如果有一项未声明则匹配不上,如果intentFilter中没有可以不添加,会使用默认的category
in.addCategory("com.skymxc.catagory.c2");
//对数据进行描述 C中定义了协议为 file
in.setDataAndType(Uri.parse("http://"),"audio/13");
if (in.resolveActivity(getPackageManager())!=null){
    //启动
    startActivity(in);
}else{
    Toast.makeText(this,"系统中不存在可以执行此操作的程序",Toast.LENGTH_SHORT).show();
}

为某个结果启动一个Activity

如果启动一个Activit只为获得某个结果 可以 使用 startActivityForResult() 来启动一个Activity ,在获得结果后会回调 方法:onActivityResult();

去图库获取图片 第二个参数是请求码 在onActivityResult()中区分结果

代码语言:javascript
复制
Intent intent1 = new Intent(Intent.ACTION_PICK);
intent1.setData(MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
//为了结果去启动一个Activity
startActivityForResult(intent1,50);

onActivityResult()中获取到取得的图片

代码语言:javascript
复制
/**
 *
 * @param requestCode 启动时的 requestCode
 * @param resultCode 跳转的activity给的
 * @param data 跳转的activity给的 返回的数据
 */
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode== 50 && resultCode ==RESULT_OK && data != null){
       Uri uri = data.getData(); //返回是标识符指定图片所在的位置的统一资源标识符
        img.setImageURI(uri);  //设置给 ImageView
    }
}

保存Activity的状态

当用户 离开Activity去往另一个Activity时;Activity会被压入返回栈,如果内存不够就会被销毁 ,当Activity被销毁后其中的数据当然就没了,如果需要保留这些数据可调用 方法 onSaveInstanceState()方法

代码语言:javascript
复制
@Override
public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
    //存入数据
   outState.putBoolean("checked",true);
}

当此Activity被创建时 就能取出数据了

代码语言:javascript
复制

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (savedInstanceState!=null){
        boolean checked = savedInstanceState.getBoolean("checked");
    }
    setContentView(R.layout.activity_main);
}

Activity的生命周期

看一张图描述了整个Activity由生到死的一套回调方法

生命周期
生命周期

回调方法说明

先说一下上图的方法:

  • onCreate() :创建Activity ,可以在这里进行初始一些视图和数据
  • onStart(): 启动Activity ,这里你就可以看到 这个activity了
  • onResume(): 调用这个方法前 只能看到Activity 并不能进行交互 ,执行完此方法才可以进行交互 ,整个Activity就彻底的运行起来了
  • onPause() :停止用户交互 你可以看到 但是 不能交互了 比如 启动另一个透明的Dialog Activity 你可以看到原本的Activity ,但是已经失去了焦点 ,无法交互
  • onStop() :当前Activity被覆盖时调用 例如 当前activity1跳往到activity2 ,activity就会把activity1覆盖,这时就调用了此方法
  • onRestart(); 重新启动
  • onDestroy():activity再结束前调用的最后一个方法;这里可以进行一些释放资源的操作

三种阶段

  • 完整生命周期: 从调用的第一个方法 onCreate() 到最后调用一个的方法onDestroy() ,在onCreate()方法中可以进行一些全局的配置,UI的引用,数据的初始化,也可以从savedInstanceState中读取 保存在设备中或者执行reCreate方法前保存的数据等前提savedInstanceSate不为null,在onDestroy()方法中可以 释放资源等
  • 可视周期:在执行onStart()和onStop()之间 在这期间 你可以在屏幕上看到这个Activity但是 不能再前台跟用户交互 。只能看,可以理解为于禁用状态
  • 前台周期:在执行onResume() 和 onPause() 之间,在这期间,用户就可以在前台和activity交互了。

关于这里提到的intent ,intentFilter 我会在之后总结。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016-09-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Activity
    • acitivyt 是什么
      • 创建Activity
        • 启动Activity
          • 明确目标启动
          • 传递数据
          • 不明确启动目标
          • 为某个结果启动一个Activity
        • 保存Activity的状态
          • Activity的生命周期
            • 回调方法说明
            • 三种阶段
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档