初來學(xué)習(xí)Activity,基本用法

初來學(xué)習(xí)Activity,基本用法

活動是Android的四大組件之一统扳,它是一種可以包含用戶界面的組件喘帚,主要用于和用戶進行交互

創(chuàng)建活動

  • Activity是Android系統(tǒng)提供的一個活動基類,所有的活動都必須直接或間接繼承此類才能擁有活動的特性
  • Android程序的設(shè)計講究邏輯和視圖的分離咒钟,最好一個活動都能對應(yīng)一個布局吹由,布局就是用來顯示界面內(nèi)容的

布局文件

  • 創(chuàng)建布局文件: Android中布局文件是XML文件類型,當(dāng)布局文件創(chuàng)建時朱嘴,R.java文件會自動對此布局文件生成一個唯一標(biāo)識符(資源ID,在內(nèi)部類Layout中)倾鲫,當(dāng)在布局文件內(nèi)部組件添加時,R.java文件不會對組件自動生成資源ID萍嬉,需要手動生成資源ID乌昔,方式:android:id="@+id/id_name"(在內(nèi)部類Id中)
  • 加載布局文件: 在活動中調(diào)用方法:setContentView(),將布局文件的資源ID作為參數(shù)壤追,即實現(xiàn)了在此活動中加載此布局文件磕道。資源ID在R.java文件中的所屬的類都是靜態(tài)的,資源ID也是靜態(tài)的成員
    //在代碼中引用資源ID
    setContentView(R.layout.activity_main);
    //在XML文件中引用資源ID
    @string/hello_world

在清單文件中注冊活動

  • 活動的注冊聲明要放在application標(biāo)簽內(nèi)行冰,通過標(biāo)簽activity來對活動進行注冊

    <activity
        <!-- 具體注冊哪一個活動 -->
        android:name="com.example.databasetest.MainActivity"
        <!-- 指定活動標(biāo)題欄的內(nèi)容(app快捷方式的名字) -->
        android:label="@string/app_name" >
        <!-- 可以定義action和category子標(biāo)簽 -->
        <intent-filter>
            <!-- 指定當(dāng)前活動可以響應(yīng)的action -->
            <action android:name="android.intent.action.MAIN" />
            <!-- 指定當(dāng)前活動可以響應(yīng)的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標(biāo)簽內(nèi)和category標(biāo)簽內(nèi)若以上內(nèi)容,代表此活動是此應(yīng)用程序的主活動(程序啟動時资柔,首先打開此活動)

隱式啟動活動

  • 一個活動若想被隱式啟動焙贷,需要在此活動的<Activity>標(biāo)簽下配置<intent-filter>標(biāo)簽

        <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 標(biāo)簽指定動作
    • data 標(biāo)簽指定操作的數(shù)據(jù)
      • android:scheme:用于指定數(shù)據(jù)的協(xié)議部分
      • android:mimeType:用于指定可以處理的數(shù)據(jù)類型,允許使用通配符的方式進行指定
    • category 標(biāo)簽指定類別
  • 隱式意圖啟動Activity贿堰,需要為intent設(shè)置以上三個屬性,且值必須與該Activity在清單文件中對三個屬性的定義匹配

  • intent-filter節(jié)點及其子節(jié)點都可以同時定義多個啡彬,隱式啟動時只需與任意一個匹配即可

隱式啟動活動傳遞以及獲取數(shù)據(jù)

  • 隱式啟動活動羹与,通過setData(Uri uri)傳遞數(shù)據(jù)

    /*啟動系統(tǒng)打電話應(yīng)用,通過setData傳遞數(shù)據(jù)庶灿,tel就是Data標(biāo)簽中的scheme約束*/
    intent.setAction(Intent.ACTION_DIAL);
    intent.setData(Uri.parse("tel:911"));
    
  • 獲取setData中傳遞過來的數(shù)據(jù)

     //獲取啟動此Activity的intent對象
     Intent intent = getIntent();
     Uri uri = intent.getData();
    

啟動活動時傳遞數(shù)據(jù)

  • Activity通過Intent啟動時纵搁,可以通過Intent對象攜帶數(shù)據(jù)到目標(biāo)Activity

        Intent intent = new Intent(this, SecondActivity.class);
        intent.putExtra("maleName", maleName);
        intent.putExtra("femaleName", femaleName);
        startActivity(intent);
    
  • 在目標(biāo)Activity中取出數(shù)據(jù)

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

Intent還可以結(jié)合Bundle一起用于傳遞數(shù)據(jù),首先可以把需要傳遞的數(shù)據(jù)都保存在Bundle對象中往踢,然后再將Bundle對象存放在Intent里腾誉。都了目標(biāo)活動之后先從Intent中取出Bundle,再從Bundle中一一取出數(shù)據(jù)

返回數(shù)據(jù)給上一個活動

從A界面打開B界面峻呕, B界面關(guān)閉的時候利职,返回一個數(shù)據(jù)給A界面

  • 在A界面:Activity中有一個startActivityForResult()方法,此方法也是用于啟動活動的瘦癌,但這個方法期望在活動銷毀的時候能夠返回一個結(jié)果給上一個活動猪贪。

        /**
         * startActivityForResult(Intent intent, int requestCode)
         *     intent:意圖對象
         *     requestCode:請求碼,用來區(qū)分是從哪個Activity返回的數(shù)據(jù)
         * 
         * 用這個api啟動的Activity讯私,在銷毀時热押,系統(tǒng)會回調(diào)活動的onActivityResult
         */
        startActivityForResult(intent, MainActivity.RESULT);
    
  • 在B界面:

    //構(gòu)建一個用于傳遞數(shù)據(jù)的Intent對象
    Intent intent = new Intent();
    //存儲數(shù)據(jù)
    intent.putExtra("name", name);
    /**
     * setResult(int resultCode, Intent data):這個方法是專門向上一個活動返回數(shù)據(jù)用的
     *     resultCode:用于向上一個活動返回處理結(jié)果西傀,一般只是用 RESULT_OK 或 RESULT_CANCELED
     *     data:帶有數(shù)據(jù)的Intent對象
     */
    setResult(RESULT_OK, intent);
    //將此活動銷毀
        finish();
    
  • 在A界面: 回調(diào)方法onActivityResult

        /**
         * requestCode:請求碼,和startActivityForResult方法中讀取請求碼對應(yīng)桶癣,判斷是從哪個Activity返回的數(shù)據(jù)
         * resultCode:返回的處理結(jié)果
         * data:攜帶著返回數(shù)據(jù)的Intent
         */
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            
            //通過requestCode判斷是從哪一個Activity傳遞過來的數(shù)據(jù)
            switch (requestCode) {
            case MainActivity.RESULT:
                if (resultCode == RESULT_OK) {
                    //取出數(shù)據(jù)
                    String name = data.getStringExtra("name");
                    textView.setText(name);
                }
                break;
    
            default:
                break;
            }
        
        }
    

活動的啟動模式

每一個應(yīng)用程序都有一個屬于自己的任務(wù)棧

活動的啟動模式一共有四種拥褂,分別是standardsingleTop牙寞、singleTasksingleInstance饺鹃,可以在AndroidManifest.xml中通過給<activity>標(biāo)簽指定android:launchMode屬性來選額啟動模式

  • standard模式:活動默認的啟動模式,對于以此模式啟動的活動碎税,系統(tǒng)不會在乎這個活動是否已經(jīng)在返回棧中存在尤慰,每次啟動都會創(chuàng)建該活動的一個新的實例
  • singleTop模式:當(dāng)活動的啟動模式指定為singleTop,在啟動活動時如果發(fā)現(xiàn)返回棧的棧頂已經(jīng)是該活動雷蹂,則認為可以直接使用它伟端,不會再創(chuàng)建新的活動實例。不過當(dāng)活動未處于棧頂位置時匪煌,這時再啟動該活動责蝠,還是會創(chuàng)建新的實例
  • singleTask模式:當(dāng)活動的啟動模式指定為singleTask,每次啟動該活動時系統(tǒng)首先會在返回棧中檢查是否存在該活動的實例萎庭,如果發(fā)現(xiàn)已經(jīng)存在則直接使用該實例霜医,并把這個活動之上的所有活動統(tǒng)統(tǒng)出棧,如果沒有發(fā)現(xiàn)就會創(chuàng)建一個新的活動實例
  • singleInstance模式:指定為singleInstance模式的活動會啟用一個新的返回棧來管理這個活動驳规。以此模式啟動的活動屬于共享活動肴敛,系統(tǒng)中只有此活動的一個實例

活動中隱藏標(biāo)題欄

  • 代碼:

    //隱藏標(biāo)題欄
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    //加載布局文件
    setContentView(R.layout.activity_main);
    
  • 隱藏標(biāo)題欄的代碼一定要在加載布局文件之前執(zhí)行,否則程序會報錯

Toast(吐司)來提示信息

吐司是一種很好的提醒方式吗购,一段時間后會自動消失医男,并且不會占用任何屏幕空間

  • 假設(shè)在布局文件中已經(jīng)定義了一個按鈕,ID定義為:button_1.

    //findViewById()方法獲得View對象捻勉,下轉(zhuǎn)型到Button對象        
    Button button1 = (Button)findViewById(R.id.button_1);
    //調(diào)用setonClickListener方法為按鈕注冊監(jiān)聽器
    button1.setOnClickListener(new OnClickListener() {
    @Override
    //按鈕點擊镀梭,就會觸發(fā)onClick方法
    public void onClick(View v) {
        Toast.makeText(MainActivity.this, "toast", Toast.LENGTH_SHORT).show();
        }
    });
    
  • Toast的方法makeText(Context context, CharSequence text, int duration)方法創(chuàng)建一個Toast對象,三個參數(shù):context代表Toast要求的上下文對象,text代表Toast顯示的文本內(nèi)容踱启,duration代表Toast顯示的時長报账,Toast有兩個內(nèi)置常量可選LENGTH_LONGLENGTH_SHORT

使用menu

  • 在創(chuàng)建一個活動的時候,基類Activity會提供一個方法onCreateOptionsMenu埠偿,這個方法當(dāng)你在點擊手機上的功能鍵是會觸發(fā)這個事件
  1. 1: 菜單menuXML文件

    <?xml version="1.0" encoding="utf-8"?>
    <menu xmlns:android="http://schemas.android.com/apk/res/android" >
        <!-- item標(biāo)簽用來創(chuàng)建具體的一個菜單項 -->
        <item  
        <!-- 為菜單項指定一個唯一的標(biāo)識符 -->
         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) {
     //應(yīng)用布局對象創(chuàng)挨近菜單
      getMenuInflater().inflate(R.menu.main, menu);
     //返回true透罢,顯示菜單;若返回false胚想,創(chuàng)建的菜單將無法顯示
      return true;
    }
    
  3. 3: 定義菜單響應(yīng)事件

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
      //根據(jù)定義的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鍵可以銷毀一個活動
  • 調(diào)用finish()方法可以銷毀一個活動
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末琐凭,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子浊服,更是在濱河造成了極大的恐慌统屈,老刑警劉巖胚吁,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異愁憔,居然都是意外死亡腕扶,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門吨掌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來半抱,“玉大人,你說我怎么就攤上這事膜宋×蓿” “怎么了?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵秋茫,是天一觀的道長史简。 經(jīng)常有香客問我,道長肛著,這世上最難降的妖魔是什么圆兵? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮枢贿,結(jié)果婚禮上殉农,老公的妹妹穿的比我還像新娘。我一直安慰自己局荚,他們只是感情好超凳,可當(dāng)我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著耀态,像睡著了一般聪建。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上茫陆,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天,我揣著相機與錄音擎析,去河邊找鬼簿盅。 笑死,一個胖子當(dāng)著我的面吹牛揍魂,可吹牛的內(nèi)容都是我干的桨醋。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼现斋,長吁一口氣:“原來是場噩夢啊……” “哼喜最!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起庄蹋,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤瞬内,失蹤者是張志新(化名)和其女友劉穎迷雪,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體虫蝶,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡章咧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了能真。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赁严。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖粉铐,靈堂內(nèi)的尸體忽然破棺而出疼约,到底是詐尸還是另有隱情,我是刑警寧澤蝙泼,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布程剥,位于F島的核電站,受9級特大地震影響踱承,放射性物質(zhì)發(fā)生泄漏倡缠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一茎活、第九天 我趴在偏房一處隱蔽的房頂上張望昙沦。 院中可真熱鬧,春花似錦载荔、人聲如沸盾饮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽丘损。三九已至,卻和暖如春工扎,著一層夾襖步出監(jiān)牢的瞬間徘钥,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工肢娘, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留呈础,地道東北人。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓橱健,卻偏偏與公主長得像而钞,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子拘荡,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內(nèi)容