android activity基礎

Activity作為四大組件之首,是使用最為頻繁的一種組件,中文翻譯為“活動”。

activity生命周期

下面用兩個圖來闡釋activiy正常的生命周期和出現異常的生命周期;

activity啟動模式

啟動模式總共有四種:

  • standard :標準模式,每次啟動都會創建一個activity對象。
  • singTop :棧頂復用模式,啟動activity時,如果activity實例位于棧頂,那么就復用該activity對象。
  • singTask :棧內復用模式(單實例模式),啟動activity時,如果activiyu實例在棧內已經存在,那么將復用此activity。
  • singInstance :單實例模式,擁有singTask所有的特性,同時具有此模式的Activity只能單獨的位于一個任務棧中的特點。
    設置activity啟動模式的方法:
  • 方法一,在manifests.xml文件中進行聲明:
android:launchMode="singleInstance"
  • 方法二,在啟動activity時設置Flag:
Intent intent = new Intent();
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

同時,值得注意的是,我們可以利用TaskAffinity來進行申明任務棧,默認屬性就activity的包名,所以如果聲明TaskAffinity屬性值為包名,就相當于沒有指定。

隱式啟動activity

action 配對原則

Intent中的action能夠和過濾規則中的任何一個action相同即可匹配成功。

category 匹配規則

Intent如果含有cateory,那么所有的cateory都必須和過濾規則中的每一個cateory相同。startActivity和startActivityForReslut都會為其添加一個android.intent.category.DEFAULT的默認值。而這個值默認就添加到過濾策略中,但是一旦添加了其他的catagory,就需要手動添加此值,否則不能正常啟動。

data 配額規則

過濾規則中定義了data,那么Intent中必須也要定義可匹配的data。

< data android:scheme="string"
       android:host ="string"
       android:port ="string"
       android:path ="string"
       android:pathPattern="string"
       android:pathPrefix ="string"
       android:mimeType="string"
       />

URL的結構如下:

<scheme>://<host>/[<path>|<pathPrefix>|<pathPattern>]

一個完整的示例如下:

 <activity android:name=".view.SecondActivity">
            <intent-filter>
                <action android:name="reoger.hut.voice.a"/>
                <action android:name="reoger.hut.voice.b"/>
                
                <category android:name="reoger.hut.voice.c"/>
                <category android:name="reoger.hut.voice.d"/>
                <category android:name="reoger.hut.voice.e"/>
                <category android:name="android.intent.category.DEFAULT"/>
                
                <data android:mimeType="text/plain" />
            </intent-filter>
        </activity>

對應的啟動Intent代碼如下:

  PackageManager packageManager = getPackageManager();


                Intent intent = new Intent();
                intent.setAction("reoger.hut.voice.a");
                intent.addCategory("reoger.hut.voice.c");
                intent.setDataAndType(Uri.parse("file://abs"),"text/plain");
                ResolveInfo resolveInfo = packageManager.resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY);
                ComponentName componentName = intent.resolveActivity(packageManager);

                if(componentName ==null ){
                    Log.d("TAG","******/*/*********************************/*/*/*/*/**/*");
                }

                if(resolveInfo ==null)
                    Toast.makeText(MainActivity.this,"沒有找到對應的actvity",Toast.LENGTH_SHORT).show();
                else
                    startActivity(intent);

---end

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容