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的结构如下:

:///[||]

一个完整的示例如下:

 
            
                
                
                
                
                
                
                
                
                
            
        

对应的启动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

你可能感兴趣的:(android activity基础)