初来学习Activity,基本用法

初来学习Activity,基本用法

活动是Android的四大组件之一,它是一种可以包含用户界面的组件,主要用于和用户进行交互

创建活动

  • Activity是Android系统提供的一个活动基类,所有的活动都必须直接或间接继承此类才能拥有活动的特性
  • Android程序的设计讲究逻辑和视图的分离,最好一个活动都能对应一个布局,布局就是用来显示界面内容的

布局文件

  • 创建布局文件: Android中布局文件是XML文件类型,当布局文件创建时,R.java文件会自动对此布局文件生成一个唯一标识符(资源ID,在内部类Layout中),当在布局文件内部组件添加时,R.java文件不会对组件自动生成资源ID,需要手动生成资源ID,方式:android:id="@+id/id_name"(在内部类Id中)
  • 加载布局文件: 在活动中调用方法:setContentView(),将布局文件的资源ID作为参数,即实现了在此活动中加载此布局文件。资源ID在R.java文件中的所属的类都是静态的,资源ID也是静态的成员
    //在代码中引用资源ID
    setContentView(R.layout.activity_main);
    //在XML文件中引用资源ID
    @string/hello_world

在清单文件中注册活动

  • 活动的注册声明要放在application标签内,通过标签activity来对活动进行注册

    <activity
        <!-- 具体注册哪一个活动 -->
        android:name="com.example.databasetest.MainActivity"
        <!-- 指定活动标题栏的内容(app快捷方式的名字) -->
        android:label="@string/app_name" >
        <!-- 可以定义action和category子标签 -->
        <intent-filter>
            <!-- 指定当前活动可以响应的action -->
            <action android:name="android.intent.action.MAIN" />
            <!-- 指定当前活动可以响应的category -->
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    
  • 注意:

        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    

活动在注册时,action标签内和category标签内若以上内容,代表此活动是此应用程序的主活动(程序启动时,首先打开此活动)

隐式启动活动

  • 一个活动若想被隐式启动,需要在此活动的<Activity>标签下配置<intent-filter>标签

        <intent-filter >
          <action android:name="com.array.second"/>
          <data android:scheme="array" android:mimeType="aa/bb"/>
          <category android:name="android.intent.category.DEFAULT"/>
           </intent-filter>
    
    • action 标签指定动作
    • data 标签指定操作的数据
      • android:scheme:用于指定数据的协议部分
      • android:mimeType:用于指定可以处理的数据类型,允许使用通配符的方式进行指定
    • category 标签指定类别
  • 隐式意图启动Activity,需要为intent设置以上三个属性,且值必须与该Activity在清单文件中对三个属性的定义匹配

  • intent-filter节点及其子节点都可以同时定义多个,隐式启动时只需与任意一个匹配即可

隐式启动活动传递以及获取数据

  • 隐式启动活动,通过setData(Uri uri)传递数据

    /*启动系统打电话应用,通过setData传递数据,tel就是Data标签中的scheme约束*/
    intent.setAction(Intent.ACTION_DIAL);
    intent.setData(Uri.parse("tel:911"));
    
  • 获取setData中传递过来的数据

     //获取启动此Activity的intent对象
     Intent intent = getIntent();
     Uri uri = intent.getData();
    

启动活动时传递数据

  • Activity通过Intent启动时,可以通过Intent对象携带数据到目标Activity

        Intent intent = new Intent(this, SecondActivity.class);
        intent.putExtra("maleName", maleName);
        intent.putExtra("femaleName", femaleName);
        startActivity(intent);
    
  • 在目标Activity中取出数据

    Intent intent = getIntent();
    String maleName = intent.getStringExtra("maleName");
    String femaleName = intent.getStringExtra("femaleName");
    

Intent还可以结合Bundle一起用于传递数据,首先可以把需要传递的数据都保存在Bundle对象中,然后再将Bundle对象存放在Intent里。都了目标活动之后先从Intent中取出Bundle,再从Bundle中一一取出数据

返回数据给上一个活动

从A界面打开B界面, B界面关闭的时候,返回一个数据给A界面

  • 在A界面:Activity中有一个startActivityForResult()方法,此方法也是用于启动活动的,但这个方法期望在活动销毁的时候能够返回一个结果给上一个活动。

        /**
         * startActivityForResult(Intent intent, int requestCode)
         *     intent:意图对象
         *     requestCode:请求码,用来区分是从哪个Activity返回的数据
         * 
         * 用这个api启动的Activity,在销毁时,系统会回调活动的onActivityResult
         */
        startActivityForResult(intent, MainActivity.RESULT);
    
  • 在B界面:

    //构建一个用于传递数据的Intent对象
    Intent intent = new Intent();
    //存储数据
    intent.putExtra("name", name);
    /**
     * setResult(int resultCode, Intent data):这个方法是专门向上一个活动返回数据用的
     *     resultCode:用于向上一个活动返回处理结果,一般只是用 RESULT_OK 或 RESULT_CANCELED
     *     data:带有数据的Intent对象
     */
    setResult(RESULT_OK, intent);
    //将此活动销毁
        finish();
    
  • 在A界面: 回调方法onActivityResult

        /**
         * requestCode:请求码,和startActivityForResult方法中读取请求码对应,判断是从哪个Activity返回的数据
         * resultCode:返回的处理结果
         * data:携带着返回数据的Intent
         */
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            
            //通过requestCode判断是从哪一个Activity传递过来的数据
            switch (requestCode) {
            case MainActivity.RESULT:
                if (resultCode == RESULT_OK) {
                    //取出数据
                    String name = data.getStringExtra("name");
                    textView.setText(name);
                }
                break;
    
            default:
                break;
            }
        
        }
    

活动的启动模式

每一个应用程序都有一个属于自己的任务栈

活动的启动模式一共有四种,分别是standardsingleTopsingleTasksingleInstance,可以在AndroidManifest.xml中通过给<activity>标签指定android:launchMode属性来选额启动模式

  • standard模式:活动默认的启动模式,对于以此模式启动的活动,系统不会在乎这个活动是否已经在返回栈中存在,每次启动都会创建该活动的一个新的实例
  • singleTop模式:当活动的启动模式指定为singleTop,在启动活动时如果发现返回栈的栈顶已经是该活动,则认为可以直接使用它,不会再创建新的活动实例。不过当活动未处于栈顶位置时,这时再启动该活动,还是会创建新的实例
  • singleTask模式:当活动的启动模式指定为singleTask,每次启动该活动时系统首先会在返回栈中检查是否存在该活动的实例,如果发现已经存在则直接使用该实例,并把这个活动之上的所有活动统统出栈,如果没有发现就会创建一个新的活动实例
  • singleInstance模式:指定为singleInstance模式的活动会启用一个新的返回栈来管理这个活动。以此模式启动的活动属于共享活动,系统中只有此活动的一个实例

活动中隐藏标题栏

  • 代码:

    //隐藏标题栏
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    //加载布局文件
    setContentView(R.layout.activity_main);
    
  • 隐藏标题栏的代码一定要在加载布局文件之前执行,否则程序会报错

Toast(吐司)来提示信息

吐司是一种很好的提醒方式,一段时间后会自动消失,并且不会占用任何屏幕空间

  • 假设在布局文件中已经定义了一个按钮,ID定义为:button_1.

    //findViewById()方法获得View对象,下转型到Button对象        
    Button button1 = (Button)findViewById(R.id.button_1);
    //调用setonClickListener方法为按钮注册监听器
    button1.setOnClickListener(new OnClickListener() {
    @Override
    //按钮点击,就会触发onClick方法
    public void onClick(View v) {
        Toast.makeText(MainActivity.this, "toast", Toast.LENGTH_SHORT).show();
        }
    });
    
  • Toast的方法makeText(Context context, CharSequence text, int duration)方法创建一个Toast对象,三个参数:context代表Toast要求的上下文对象,text代表Toast显示的文本内容,duration代表Toast显示的时长,Toast有两个内置常量可选LENGTH_LONGLENGTH_SHORT

使用menu

  • 在创建一个活动的时候,基类Activity会提供一个方法onCreateOptionsMenu,这个方法当你在点击手机上的功能键是会触发这个事件
  1. 1: 菜单menuXML文件

    <?xml version="1.0" encoding="utf-8"?>
    <menu xmlns:android="http://schemas.android.com/apk/res/android" >
        <!-- item标签用来创建具体的一个菜单项 -->
        <item  
        <!-- 为菜单项指定一个唯一的标识符 -->
         android:id="@+id/add_item"
        <!-- 给菜单项指定一个名称 -->
         android:title="Add"
        />
        <item 
            android:id="@+id/remove_item"
            android:title="Remove"
            />
    </menu>
    
  2. 2:显示菜单文件的代码

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
     //应用布局对象创挨近菜单
      getMenuInflater().inflate(R.menu.main, menu);
     //返回true,显示菜单;若返回false,创建的菜单将无法显示
      return true;
    }
    
  3. 3: 定义菜单响应事件

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
      //根据定义的ID来判断我们点击的是哪一个菜单项
      switch (item.getItemId()) {
      case R.id.add_item:
        Toast.makeText(FirstActivity.this, "you click add", Toast.LENGTH_SHORT).show();
        break;
      default:
        break;
      }
      return true;
    }
    

销毁一个活动

  • 按下back键可以销毁一个活动
  • 调用finish()方法可以销毁一个活动
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349

推荐阅读更多精彩内容