<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 78, comments - 34, trackbacks - 0, articles - 1
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

             今日課程內容較多,我們的課上到晚720。

     

    一、創(chuàng)建新的Activity

           在進行桌面開發(fā)時,我們可以通過一個窗口上的控件事件打開另一個新的窗口。在WEB應用開發(fā)時,我們也可以通過一個連接打開一個新的頁面。通過添加新的窗口開完善或增強軟件的功能,那么在Android應用開發(fā)中,我們應該怎樣打開新的Activity

     

           1.添加新的Activity(創(chuàng)建Android工程:MainActivity)

           1).新建一個繼承自Activity類的類NewActivity

    package com.changcheng.activity;

     

    import android.app.Activity;

    import android.os.Bundle;

    import android.view.View;

    import android.widget.Button;

     

    public class NewActivity extends Activity {

     

             @Override

             protected void onCreate(Bundle savedInstanceState) {

                       super.onCreate(savedInstanceState);

                       setContentView(R.layout.new_activity);

                       // 獲取按鈕并未按鈕添加事件

                       Button button = (Button) this.findViewById(R.id.newa_bt_close);

                       button.setOnClickListener(new View.OnClickListener() {

                               

                                @Override

                                public void onClick(View v) {

                                         NewActivity.this.finish();

                                }

                       });

             }

            

    }

     

           2).AndroidManifest.xml文件中添加

    <?xml version="1.0" encoding="utf-8"?>

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"

          package="com.changcheng.activity"

          android:versionCode="1"

          android:versionName="1.0">

        <application android:icon="@drawable/icon" android:label="@string/app_name">

            <activity android:name=".MainActivity"

                      android:label="@string/app_name">

                <intent-filter>

                    <action android:name="android.intent.action.MAIN" />

                    <category android:name="android.intent.category.LAUNCHER" />

                </intent-filter>

            </activity>

            <!-- 新的Activity -->

                       <activity  android:name=".NewActivity"

                      android:label="@string/new_activity" />

        </application>

        <uses-sdk android:minSdkVersion="7" />

    </manifest>

     

           3).newactivity.xml

    <?xml version="1.0" encoding="utf-8"?>

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

             android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent">

            

             <TextView android:layout_width="fill_parent"

                       android:layout_height="wrap_content" android:text="@string/newa_activity" />

     

             <!-- 關閉按鈕 -->

             <Button android:layout_width="fill_parent"

                       android:layout_height="wrap_content" android:text="@string/newa_bt_close"

                       android:id="@+id/newa_bt_close" />

    </LinearLayout>

     

           4).strings.xml

    <?xml version="1.0" encoding="utf-8"?>

    <resources>

        <string name="hello">Hello World, MainActivity!</string>

        <string name="app_name">創(chuàng)建新的Activity</string>

        <string name="bt_open_new_activity">打開新的Activity</string>

        <string name="new_activity">新的Activity</string>

        <string name="newa_activity">新的Activity</string>

             <string name="newa_bt_close">關閉</string>

    </resources>

     

           5).MainActivity.java

    package com.changcheng.activity;

     

    import android.app.Activity;

    import android.content.Intent;

    import android.os.Bundle;

    import android.view.View;

    import android.widget.Button;

     

    public class MainActivity extends Activity {

             /** Called when the activity is first created. */

             @Override

             public void onCreate(Bundle savedInstanceState) {

                       super.onCreate(savedInstanceState);

                       setContentView(R.layout.main);

                       // 獲取按鈕,并為按鈕添加單擊的事件

                       Button button = (Button) this.findViewById(R.id.bte_open_new_activity);

                       button.setOnClickListener(new View.OnClickListener() {

     

                                @Override

                                public void onClick(View v) {

                                         // 創(chuàng)建顯式意圖

                                         Intent intent = new Intent(MainActivity.this, NewActivity.class);

                                         // 打開新的Activity

                                         startActivity(intent);

                                }

                       });

     

             }

    }

     

    二、Activity之間傳遞參數

           在桌面程序中窗口之間,我們可以通過構造參數或全局變量來傳遞數據。在WEB應用中,我們可以通過域(request\response\session...)在頁面之間傳遞數據。那如何在Android的Activity之間傳遞參數呢?

     

           通過intent.putExtra方法為意圖添加參數,打開新的Activity后可以通過this.getIntent().getStringExtra()等方法獲取參數。     

          

    三、請求碼與結果碼

           在上面的程序中我們通過startActivity(intent)打開一個新的Activity,Android為了減少組件間的耦合,所以使用了Intent(Intent在下面會有介紹)。所以我們在onClick事件打開的新Activity不與主Activity在一個線程中。但是,當新Activity被關閉后,會觸發(fā)主Activity的onActivityResult事件。    

     

           1.請求碼

           在一個業(yè)務中可能在兩個按鈕被單擊事件中打開同一個Activity,但我們在onActivityResult事件中如何判斷是哪個按鈕打開了新的Activity?請求碼就是為解決這個問題的,那么我們打開新的Activity時應該使用startActivityForResult(intent, 1);。其中的第二個參數就是請求碼。

          

           onActivityResult事件:

    @Override

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {

             // TODO Auto-generated method stub

             super.onActivityResult(requestCode, resultCode, data);

    }

     

           onactivityResult事件中,通過判斷requestCode更可知道被關閉Activity是通過哪個位置打開的。

     

           2.結果碼

           在一個業(yè)務中可能要打開多個不同的Activity,那關閉Activity時在onactivityResult事件中我們如何知道關閉的是哪一個Activity呢?結果碼就是為解決這個問題的,那么我們打開新的Activity時應該使用setResult(2, intent);或在關閉Activity前調用ActivityObj.setResult(2);。其中的第一個參數就是結果碼。

     

           在onactivityResult事件中,通過判斷resultCode更可知道是哪個Activity被關閉了。

     

    三、Intent意圖

           Android基本的設計理念是鼓勵減少組件間的耦合,因此Android提供了Intent (意圖) ,Intent提供了一種通用的消息系統,它允許在你的應用程序與其它的應用程序間傳遞Intent來執(zhí)行動作和產生事件。使用Intent可以激活Android應用的三個核心組件:活動、服務和廣播接收器。

     

           Intent可以劃分成顯式意圖和隱式意圖:

           1).顯式意圖:調用Intent.setComponent()或Intent.setClass()方法指定了組件名或類對象的Intent為顯式意圖,顯式意圖明確指定了Intent應該傳遞給哪個組件。比如我們上邊的打開新的Activity程序。

           2).隱式意圖:沒有調用Intent.setComponent()或Intent.setClass()方法指定組件名或類對象的Intent為隱式意圖。 Android系統會根據隱式意圖中設置的動作(action)、類別(category)、數據(URI和數據類型)找到最合適的組件來處理這個意圖。通過隱式意圖打開新的Activity

           AndroidManifest.xml:

    <!-- 新的Activity -->

    <activity android:name=".NewActivity" android:label="@string/new_activity">

             <intent-filter>

                       <action android:name="com.changcheng.activity.NewActivity"/>

                       <category android:name="android.intent.category.DEFAULT" />

             </intent-filter>

    </activity>

     

           MainActivity:

    @Override

    public void onClick(View v) {

             // 創(chuàng)建顯式意圖

             Intent intent = new Intent("com.changcheng.activity.NewActivity");

             //Intent intent = new Intent(MainActivity.this, NewActivity.class);

             // 打開新的Activity

             startActivity(intent);// 發(fā)送Intent,意圖里相當于有一個類別:android.intent.category.DEFAULT

    }

     

           intent過濾器中還可以添加多個actioncategory,還可以添加data。具體使用在此就不做總結了,可以查看相關資料或幫助文檔。

     

           3).顯式意圖與隱式意圖的應用場景:

           在項目內部建議使用顯式意圖。

             在應用與應用之間只能使用隱式意圖。

     

    四、Activity的生命周期

             Activity有三個狀態(tài):

             當它在屏幕前臺時(位于當前任務堆棧的頂部),它是激活或運行狀態(tài)。它就是響應用戶操作的Activity。

             當它失去焦點但仍然對用戶可見時,它處于暫停狀態(tài)。即在它之上有另外一個Activity。這個Activity也許是透明的,或者沒有完全覆蓋全屏,所以被暫停的Activity仍對用戶可見。暫停的Activity仍然是存活狀態(tài)(它保留著所有的狀態(tài)和成員信息并保持和窗口管理器的連接),但系統處于極低內存時仍然可以殺死這個Activity。

             完全被另一個Activity覆蓋時則處于停止狀態(tài)。它仍然保留所有的狀態(tài)和成員信息。然而對用戶是不可見的,所以它的窗口將被隱藏,如果其它地方需要內存,則系統經常會殺死這個Activity。

            

             Activity從一種狀態(tài)轉變到另一種狀態(tài)時,會調用以下保護方法來通知這種變化:

             void onCreate(Bundle savedInstanceState)

             void onStart()

             void onRestart()

             void onResume()

             void onPause()

             void onStop()

             void onDestroy()


             這七個事件定義了Activity的完整生命周期。實現這些事件方法可以幫助我們監(jiān)視其中的三個嵌套生命周期循環(huán):

     

             1).Activity的完整生命周期自第一次調用onCreate()開始,直至調用onDestroy()為止。ActivityonCreate()中設置所有全局狀態(tài)以完成初始化,而在onDestroy()中釋放所有系統資源。例如,如果Activity有一個線程在后臺運行從網絡上下載數據,它會在onCreate()創(chuàng)建線程,而在 onDestroy()銷毀線程。

     

             2).Activity的可視生命周期自onStart()調用開始直到相應的onStop()調用結束。在此期間,用戶可以在屏幕上看到Activity,盡管它也許并不是位于前臺或者也不與用戶進行交互。在這兩個方法之間,我們可以保留用來向用戶顯示這個Activity所需的資源。例如,當用戶不再看見我們顯示的內容時,我們可以在onStart()中注冊一個BroadcastReceiver來監(jiān)控會影響UI的變化,而在onStop()中來注消。onStart() 和 onStop() 方法可以隨著應用程序是否為用戶可見而被多次調用。

     

             3).Activity的前臺生命周期自onResume()調用起,至相應的onPause()調用為止。在此期間,Activity位于前臺最上面并與用戶進行交互。Activity會經常在暫停和恢復之間進行狀態(tài)轉換——例如當設備轉入休眠狀態(tài)或者有新的Activity啟動時,將調用onPause() 方法。Activity獲得結果或者接收到新的Intent時會調用onResume() 方法。關于前臺生命周期循環(huán)的例子請見PPT下方備注欄。

     

    五、廣播接收者

             廣播接收者(BroadcastReceiver)用于異步接收廣播Intent,廣播Intent的發(fā)送是通過調用Context.sendBroadcast()Context.sendOrderedBroadcast()或者Context.sendStickyBroadcast()來實現的。通常一個廣播Intent可以被訂閱了此Intent的多個廣播接收者所接收,廣播接收者和JMS中的Topic消息接收者很相似。要實現一個廣播接收者方法如下:

     

             1).繼承BroadcastReceiver,并重寫onReceive()方法。

             2).訂閱感興趣的廣播Intent,訂閱方法有兩種:

    ·          使用代碼進行訂閱:

             IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");

             IncomingSMSReceiver receiver = new IncomingSMSReceiver();

             registerReceiver(receiver, filter);

    ·          AndroidManifest.xml文件中的<application>節(jié)點里進行訂閱:

             <receiver android:name=".IncomingSMSReceiver">

                 <intent-filter>

                      <action android:name="android.provider.Telephony.SMS_RECEIVED"/>

                 </intent-filter>

             </receiver>

     

             通常一個BroadcastReceiver對象的生命周期不超過5秒,所以在BroadcastReceiver里不能做一些比較耗時的操作,如果需要完成一項比較耗時的工作,可以通過發(fā)送IntentActivityService,由ActivityService來完成。

     

    六、服務

             Android中的服務和windows中的服務是類似的東西,服務一般沒有用戶操作界面,它運行于系統中不容易被用戶發(fā)覺,可以使用它開發(fā)如監(jiān)控之類的程序。服務的開發(fā)比較簡單,如下:

     

             1.繼承Service

             public class SMSService extends Service { }

             2.AndroidManifest.xml文件中的<application>節(jié)點里對服務進行配置:

             <service android:name=".SMSService" />

     

             服務不能自己運行,需要通過調用Context.startService()Context.bindService()方法啟動服務。這兩個方法都可以啟動Service,但是它們的使用場合有所不同。使用startService()方法啟用服務,調用者與服務之間沒有關連,即使調用者退出了,服務仍然運行。使用bindService()方法啟用服務,調用者與服務綁定在了一起,調用者一旦退出,服務也就終止。

             如果打算采用Context.startService()方法啟動服務,在服務未被創(chuàng)建時,系統會先調用服務的onCreate()方法,接著調用onStart()方法。如果調用startService()方法前服務已經被創(chuàng)建,多次調用startService()方法并不會導致多次創(chuàng)建服務,但會導致多次調用onStart()方法。采用startService()方法啟動的服務,只能調用Context.stopService()方法結束服務,服務結束時會調用onDestroy()方法。

     

             如果打算采用Context.bindService()方法啟動服務,在服務未被創(chuàng)建時,系統會先調用服務的onCreate()方法,接著調用onBind()方法。這個時候調用者和服務綁定在一起,調用者退出了,系統就會先調用服務的onUnbind()方法,接著調用onDestroy()方法。如果調用bindService()方法前服務已經被綁定,多次調用bindService()方法并不會導致多次創(chuàng)建服務及綁定(也就是說onCreate()和onBind()方法并不會被多次調用)。如果調用者希望與正在綁定的服務解除綁定,可以調用unbindService()方法,調用該方法也會導致系統調用服務的onUnbind()-->onDestroy()方法。


    只有注冊用戶登錄后才能發(fā)表評論。


    網站導航:
     
    主站蜘蛛池模板: 亚洲精品无码99在线观看 | 亚洲日韩精品无码专区加勒比☆ | 色五月五月丁香亚洲综合网| 亚洲一区影音先锋色资源| 亚洲高清无码在线观看| 最近中文字幕无免费视频| 69pao强力打造免费高清| 国产又黄又爽又大的免费视频| 日韩色日韩视频亚洲网站| 亚洲中文久久精品无码1 | 免费人成视频在线观看网站| 一区二区三区在线免费| 韩国亚洲伊人久久综合影院| 亚洲av无码专区在线| 亚洲美女一区二区三区| 日韩成人免费视频| 成人免费网站视频www| 免费在线观看亚洲| 亚洲国产欧美日韩精品一区二区三区| 亚洲午夜电影在线观看| 亚洲精品白色在线发布| 久久亚洲AV成人无码软件| 亚洲一区中文字幕久久| 亚洲精品熟女国产| 亚洲视频中文字幕在线| 2022年亚洲午夜一区二区福利 | 插鸡网站在线播放免费观看| 一级做a爰片久久毛片免费陪| 亚洲AV成人无码久久WWW| 亚洲欧美成人综合久久久| 亚洲中文字幕无码av永久| 亚洲乱码一区二区三区国产精品| 亚洲伦理中文字幕| 国产亚洲福利在线视频| 亚洲精品动漫免费二区| 久久亚洲色WWW成人欧美| 免费观看亚洲人成网站| 国产乱子伦精品免费视频| 中国性猛交xxxxx免费看| 免费观看在线禁片| 亚洲免费网站在线观看|