android 大神新手求助啊。。。在AndroidManifest.xml中多个intent-filter属性,怎么区分哪个是主入口啊。
一个应用程序可以有多个Activity,每个Activity是同级别的,那么在启动程序时,最先启动哪个Activity呢?有些程序可能需要显示在程序列表里,有些不需要。怎么定义呢?android.intent.action.MAIN决定应用程序最先启动的Activity
,android.intent.category.LAUNCHER决定应用程序是否显示在程序列表里。Main和LAUNCHER同时设定才有意义,
如果有多个同级的Activity都有过滤器
则只有最前面的Activity的 <action
android:name="android.intent.action.MAIN"
/> 有效,启动该程序时,执行的是该Activity。且在程序列表中有多个图标,这些Activity都在程序列表中显示,该Application有多个入口,执行不同的Activity,但是整个程序的主入口(整个程序最先运行的那个activity)只有最先定义的那个Activity。
如 果一个应用没有LAUNCHER则该apk仍能安装到设备上,但是在主程序图中看不到。如果给那个Activity
设定了LAUNCHER,且同时设定了Main,则这个Activity就可出现在程序图中;如果没有Main,则不知启动哪个Activity,故也不会有图标出现。
android中,intentfilter怎么动态添加属性
千 锋扣丁学堂iOS开发为您解答:1. Android把安装的包中可获得的Intent Filter放到一个列表中。2. 动作和与正在解析的Intent的种类不关联的Intent Filter会从列表中删除。2.1. 动作匹配指Android Intent Filter包含特定的动作或没有指定的动作。一个Intent Filter有一个或多个定义的动作,如果没有任何一个能与Intent指定的动作匹配的话,这个Intent Filter在算作是动作匹配检查失败。2.2. 种类匹配更为严格。Intent Filter必须包含所有在解析的Intent中定义的种类。一个没有特定种类的Intent Filter只能与没有种类的Intent匹配。3. Intent的数据URI中的部分会与Intent Filter中的data标签比较。如果Intent Filter定义scheme,host/authority,path或mimetype,这些值都会与Intent的URI比较。任何不匹配都会导致Intent Filter从列表中删除。没有指定data值的Android Intent Filter会和所有的Intent数据匹配。3.1. mimetype是正在匹配的数据的数据类型。当匹配数据类型时,你可以使用通配符来匹配子类型(例如,earthquakes/*)。如果Intent Filter指定一个数据类型,它必须与Intent匹配;没有指定数据的话全部匹配。3.2. scheme是URI部分的协议——例如,http:,mailto:,tel:。3.3. host-name或“data authority”是介于URI中scheme和path之间的部分。匹配主机名时,Intent Filter的scheme也必须通过匹配。3.4. 数据path是紧接在“data authority”的后面(例如,/ig)。path只在scheme和host-name部分都匹配的情况下才匹配。4. 如果这个过程中多于一个组件解析出来的话,它们会以优先度来排序,可以在Android Intent Filter的节点里添加一个可选的标签。最高等级的组件会返回。 Android本地的应用程序组件和第三方应用程序一样,都是Intent解析过程中的一部分。它们没有更高的优先度,可以被新的Activity完全的代替,这些新的Activity宣告自己的Intent Filter能响应相同的动作请求。
如何在动态配置的broadcastreceiver里接收到action
1.自定义一个广播处理者
//如果广播事件处理类是一个内部内的话,一定要声明为static的;如果还要注册为自定义广播那么要在主配置文件中receiver android:name声明格式为**.**.**.父类$当前类
public class MyCustomReceiver extends BroadcastReceiver{
//处理广播
@Override
public void onReceive(Context context, Intent intent) {
//接收广播进行处理
String cmdAction=intent.getAction();//获取当前广播的action
if("cn.android.app.current_weather".equals(cmdAction)){
String getValue=intent.getStringExtra("weatherState");//获取当前广播的data ;
System.out.println("广播接受成功,当前的传递的信息是:"+getValue);
}
}
}
使用自己的广播,可以在主配置文件xml中使用receiver标签(注册处理广播的BroadcastReceiver类)和子标签intent-filter(需要action 属性来过滤广播,以便接受广播时能获取对应的那个广播)标签进行广播的静态注册,然后在代码中只需要发送广播就可以了,程序会自己去寻找主配置文件中所配置的对应广播的处理者;
在代码中发送自定义广播后,系统除了会自动调用对应(action一致)的在主配置文件中使用receiver标签注册广播的广播处理类,还会调用在发送广播之前,其他通过代码注册了广播的处理者 ;一般对于自定义广播的处理者,一般就一个,多是使用主配置文件静态注册广播处理者来处理广播.
(无论是在代码中还是在主配置文件中,我们都可以注册多个广播处理者以共同接受处理广播,不过无论在那个地方注册,同一广播处理者在所在注册区域,只能有效注册一次,重复不会报错,只是无效).
使用自定义一个广播处理者可以在主配置文件中进行静态注册,那么在发送广播之后,广播处理者就能接收到广播了,而且这种形式是伴随着整个应用的生命周期(如果这种方式处理的广播是系统广播的话,那么不管应用程序是否开启,该广播处理者都能进行对广播的处理),不像代码那样只会伴随着context(一般是指activity和Service)的生命周期;
广播处理者(receiver)注册+广播过滤器声明(intent-filter) ,在主配置文件中使用不然毫无意义;
注意:
(1) , 其实对于自定义的广播的处理,也完全可以不在主配置文件中进行如上注册,只要我们在发送自定义广播之前,进行了广播处理者的注册(注册后要在生命周期结束时,卸载广播,不然会报错),那么在发送自定义广播后依然能够处理到广播。
(不过代码注册的对于自定义广播的处理和在主配置文件中的静态注册区别是不能伴随整个应用程序,只能是所在context(一般是指activity和Service)的生命周期;还有,自定义广播中的action可以随便定义,只要注册和发送广播时使用的是一致的,那么就能实现对广播事件的处理);
(2) , 在主配置文件中进行对广播事件处理者的静态注册,一般是两个原因 :
1,不管在所在程序是否开启都要处理系统广播 ;
2,免去了在代码需要事先注册的情况,在代码中只需发送广播就可以对广播的进行处理,且这种广播处理者的生命周期是伴随整个应用程序(自定义广播)或者整个系统(系统广播) ;
所以是否通过主配置文件注册广播处理者,还是根据需求来定.
2.发送广播
发送广播一般由两部分组成:1:action (指定为是那种广播); 2:data (指定广播的信息);其中第一个是成功发出广播所必须要的;
代码实例
类型和解说
// 1:实例化一个Intent对象
Intent intent = new Intent();
// 2:添加广播的action
intent.setAction(Intent.ACTION_EDIT);
// 3:调用sendBroadcast把广播发送出去
sendBroadcast(intent);
(1)发送系统广播
如果在主配置文件中通过标签里面引用了对应的系统广播的话
(对应下面发送广播的intent-filter action的是"android.intent.action.EDIT"),那么在系统广播发出之后(这里通过代码发送系统广播),系统就会自动发送广播给那个广播处理类;
// 1:实例化一个Intent对象
Intent intent = new Intent();
// 2:添加广播的action,action的值是自定义的;
intent.setAction("cn.android.app.current_weather");
//3.添加发送广播的data,以便处理者针对对应的广播处理,有数据可以使用;
intent.putExtra("weatherState", "哈哈");
//4:调用sendBroadcast把广播发送出去
sendBroadcast(intent);
(2)发送自定义的广播
3.动态注册广播处理者
动态注册广播处理者,也就是通过代码注册广播处理者,它的生命周期伴随着context(一般是指activity和Service);
如果注册的广播处理者只需要在程序运行片段的时候去处理广播,不需要在主配置文件中进行静态注册的话,就如下,直接通过代码注册广播处理者;
代码实例
类型和解说
//创建Intent过滤器实例
IntentFilter intentFilter=new IntentFilter();
//给过滤器设置相应的action
intentFilter.addAction(Intent.ACTION_MEDIA_MOUNTED);
intentFilter.addAction(Intent.ACTION_MEDIA_UNMOUNTED);
intentFilter.addAction(Intent.ACTION_MEDIA_REMOVED);
intentFilter.addAction(Intent.ACTION_BATTERY_CHANGED);
intentFilter.addAction(Intent.ACTION_BOOT_COMPLETED);
//intentFilter.addAction(Intent.action_Me)
//注册挂载广播
MReceiver mReceiver=MReceiver();
registerReceiver(mReceiver, intentFilter);
//卸载广播
unregisterReceiver(mReceiver);
(1).注册接受系统广播的广播处理类;
// 创建Intent过滤器实例
IntentFilter intentFilter = new IntentFilter();
// 给过滤器设置相应的action
intentFilter.addAction("cn.android.app.current_weather");
//注册挂载广播
MReceiver mReceiver=MReceiver();
registerReceiver(mReceiver, intentFilter);
//卸载广播
unregisterReceiver(mReceiver);
(2).注册接受自己的广播的广播处理类;
4.静态注册广播处理者
静态注册也就是在主配置文件中进行的对于广播的处理者的注册,它的形式:需要通过receiver声明广播处理者,intent-filter action声明所要处理的广播。
如果一个广播处理者不管所归属的程序是否开启都要处理系统广播的话,那么需要在主配置文件里面进行注册,这种静态注册的主要是针对于系统广播的处理者,它的生命周期将会伴随整个系统。
注意:
若在主配置文件中静态注册的是自定义广播处理类,那么在代码中发送了自定义的广播后,系统会自动发送广播到注册广播时的广播处理者,这种对于自定义广播的处理者的静态注册,它的生命周期是整个应用程序。
BroadcastReceiver广播处理者静态注册
值的一提的是:
总结:
1,在代码中如果注册了BroadcastReceiver,那么在关闭context(一般是指activity和Service)时一定要在onDestroy方法里或context消亡之前卸载注册,还有卸载注册前一定要先注册,不然都会报错,可以通过一个flag来标记注册或者卸载;
2,在代码中或者主配置文件中重复使用一个BroadcastReceiver注册同一个广播不会报错,只是,重复注册无效(比如在代码中,不管重新实例化多少次,只要所使用的广播处理对象是同一个BroadcastReceiver类),仍然视为只注册了一次,无论是代码中还是主配置文件中 ;
3.在代码中或者主配置文件中重复使用一个BroadcastReceiver注册接收多个不同的广播是可以的,在BroadcastReceiver注册时所指向的这些广播被发出后,BroadcastReceiver都能收到,不过要在BroadcastReceiver中需要根据action判断当前收到的何种广播然后进行分别处理 ;
(代码中重复使用IntentFilter的addAction方法,或者重新实例化IntentFilter再addAction然后注册到广播去 ;
同理主配置文件中重复使用的的<action标签)
4,若是使用同一个广播处理类在代码中和主配置文件中分别进行注册,那么在广播发出后,该广播处理类会处理两次广播 ,不过像前面注意2说的,他们分布在各自的注册区域最多有效注册为第一次, 重复注册无效 ;
转载仅供参考,版权属于原作者


