关于androidManifest.xml的概叙以及intent-filter的详细分析

本文介绍AndroidManifest.xml配置文件的关键组成部分,包括如何通过Intent-filter定义应用的主要入口及组件间交互。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


AndroidManifest.xml配置文件对于Android应用开发来说是比较细但又很重要的基础知识,本文旨在总结该配置文件中常用到的几个属性,以便日后查阅,至于那些比较细的属性,主要是平时开发比较少用便不列举,如果自己有需要直接在eclipse中直接“alt+/”就好了……

下面是一个比较通用的AndroidManifest.xml文件样例(所建的工程目录是Test),

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.test"
    android:versionCode="1"
    android:versionName="1.0" >

    <!-- SDK版本的要求 -->
    <uses-sdk
        android:minSdkVersion="14"
        android:targetSdkVersion="21" />
    
    <!-- 获取系统相关的权限配置 如果不知道系统有多少属性,不用那么麻烦去搜,直接在name便签的双引号里alt+/就好,多直接~ -->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    
    <!-- 应用配置细节 
      icon是图标;
      label是程序名称显示在titlebar中的
      theme是整个程序的主题,这里是自己文件定义的主题,如果想用android的就是@android:style/Theme再加alt+/就可以随便选了
   -->
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <!-- Activity配置 -->
        <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" />
                <data android:host="MainActivity"/>
            </intent-filter>
        </activity>
        
        <!-- Service配置 -->
        <service >
            <intent-filter >
                <action />
                <category />
                <data />
            </intent-filter>
        </service>
        
        <!-- Receive配置 -->
        <receiver >
            <intent-filter />
            <meta-data />
        </receiver>
        
        <!-- Provider配置 -->
        <provider >
            <grant-uri-permission />
            <meta-data />
            <path-permission />
        </provider>
        
        <!-- 程序需要的外部库 -->
        <uses-library />
        
    </application>

</manifest>

 

     纵观上面的各个系统组件配置,基本都有一个Intent-filter属性,来对系统中各种乱七八糟的intent进行过滤处理。因为android系统中会时时刻刻发送着各种消息各种intent,有些是系统发的有些是各个程序发的,怎么从那么多的消息中获取自己想要的?那就过滤,Intent-filter就是起这个作用。下面我们来详细问题一下这个Intent-filter的相关属性,虽然各个组件的Intent-filter有差别,但是了解大概后,基本都差不多,举一反三,触类旁通嘛。

     Intent消息还包含有名称、动作、数据、类别几个重要属性,同时这几个点因过滤的标签的不同而有一些差别。

  <action>标签用于描述具体消息的名称;

  <category>标签用于表示能处理消息组件的类别;

  <data>标签则用于描述消息需要处理的数据格式,支持使用正则表达式来限定数据来源;

例如以下是一个activity的intent-filter:

<intent-filter>  
    <action android:name="wytings msg" />  
    <category android:name="android.intent.category.DEFAULT" />  
    <data mimeType="*/*" />  
</intent-filter>  

只要系统中有程序发出的intent的action为wytings msg这个activity就可以收到。

category设置的是默认配置,一般category主要就是android.intent.category.DEFAULT和android.intent.category.LAUNCHER两个(前者是默认配置,看action怎么设置,就怎么启动,后者是代表的第一个启动的基本都得和<action android:name="android.intent.action.MAIN" />一起用),其他的看自己需求,要是还是不知道还是alt+/就好了。

data中设置了处理类型,意思就是消息我收到了,如果不是我处理的类型,我依然不干活。比如我们把上面的action设置为android.intent.action.SEND(意思是当我们点发送的时候,系统就会调用这个activity,还有个前提是发送的文件得是它支持的,这里是什么都文件类型都支持)


android 新手助在AndroidManifestxml中多个intent-filter属性,怎区分哪个是主入口

一个应用程序可以有多个Activity,每个Activity是同级别的,那么在启动程序时,最先启动哪个Activity呢?有些程序可能需要显示在程序列表里,有些不需要。怎么定义呢?android.intent.action.MAIN决定应用程序最先启动的Activity 
,android.intent.category.LAUNCHER决定应用程序是否显示在程序列表里。Main和LAUNCHER同时设定才有意义,

如果有多个同级的Activity都有过滤器

<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

则只有最前面的Activity的 <action 
android:name="android.intent.action.MAIN" 
/> 有效,启动该程序时,执行的是该Activity。且在程序列表中有多个图标,这些Activity都在程序列表中显示,该Application有多个入口,执行不同的Activity,但是整个程序的主入口(整个程序最先运行的那个activity)只有最先定义的那个Activity。

如 果一个应用没有LAUNCHER则该apk仍能安装到设备上,但是在主程序图中看不到。如果给那个Activity 
设定了LAUNCHER,且同时设定了Main,则这个Activity就可出现在程序图中;如果没有Main,则不知启动哪个Activity,故也不会有图标出现。
 

安卓开发的时在Manifest文件中有一个<intent-filter>里面包含<action>与<category>

android.intent.action.MAIN
决定应用程序最先启动的Activity
android.intent.category.LAUNCHER

决定应用程序是否显示在程序列表里


转载自http://www.bkjia.com/Androidjc/907642.html

<think>好的,我现在需要帮助用户解决关于AndroidManifest.xml中入口点定位的问题。用户之前提供的清单文件中,注释掉了主Activity的声明,现在他们想知道如何通过intent-filter确定主Activity或启动Service。 首先,我应该回顾一下AndroidManifest.xml的结构,特别是关于入口点的部分。通常,主Activity会有LAUNCHER类别,但用户的文件中这部分被注释掉了。这意味着应用可能没有常规的主Activity,或者启动方式不同。 接下来,用户提到应用可能通过Service或BroadcastReceiver启动。例如,清单中的BootCompleteReceive接收器监听开机广播,可能在系统启动时触发。此外,ISANaviService服务通过自定义action被调用,可能由其他组件或应用启动。 我需要解释没有主Activity的情况下,应用如何被启动。可能涉及系统权限、持久化服务以及广播触发的机制。用户可能想知道在这种情况下应用的入口点是什么,以及调用顺序如何开始。 还要考虑用户之前的讨论,他们分析了APK的调用顺序,涉及Java、JNI和C++模块。现在需要将入口点与这些模块联系起来,比如Application类的onCreate方法可能作为入口点,加载JNI库并初始化服务。 另外,用户可能对系统应用的启动方式感兴趣,因为他们的应用使用了sharedUserId="android.uid.system",这需要特定的签名和权限。需要说明系统应用可能的启动途径,如系统服务触发或开机广播。 最后,确保回答清晰,分步骤说明如何定位入口点,即使没有主Activity,并提供相关问题以帮助用户进一步理解。</think>在提供的`AndroidManifest.xml`中,**入口点定位**需要结合组件声明和系统特性分析: ### 1. **无常规主Activity** - 注释掉的`MainActivity`部分表明应用**不通过桌面图标启动**: ```xml <!-- <activity android:name=".ui.MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> --> ``` ### 2. **隐式启动入口点** - **Service入口**:`ISANaviService`通过以下方式被外部调用: ```xml <service android:name="com.isa.navi.service.ISANaviService"> <intent-filter> <action android:name="com.isa.intent.action.ISA_NAVI" /> <action android:name="com.isa.intent.action.ISA_CARPLAY" /> </intent-filter> </service> ``` - 其他应用或系统通过发送`Intent`携带上述action启动服务: ```java Intent intent = new Intent("com.isa.intent.action.ISA_NAVI"); context.startService(intent); ``` - **广播接收器入口**:`BootCompleteReceive`在系统启动后触发: ```xml <receiver android:name="com.isa.navi.BootCompleteReceive"> <intent-filter android:priority="2147483647"> <action android:name="android.intent.action.LOCKED_BOOT_COMPLETED" /> </intent-filter> </receiver> ``` - 系统会在锁定状态下完成启动时自动触发该接收器(需系统权限)。 ### 3. **Application类为隐式入口** - `ISANaviApplication`作为自定义`Application`类,在进程首次启动时执行: ```xml <application android:name="com.isa.navi.ui.ISANaviApplication"> ``` - 其`onCreate()`方法可能是JNI库加载和全局初始化的起点: ```java public class ISANaviApplication extends Application { static { System.loadLibrary("native-lib"); // 加载C++库 } @Override public void onCreate() { super.onCreate(); // 初始化服务或注册广播 } } ``` ### 4. **系统级启动特性** - **系统权限启动**:由于`sharedUserId="android.uid.system"`,应用可能由系统服务直接调用。 - **持久化进程**:`android:persistent="true"`确保应用崩溃后会被系统重启。 ### 5. **调用顺序起点** - **首次触发场景**: 1. 系统启动完成 → `BootCompleteReceive`接收广播 → 启动`ISANaviService` 2. 其他组件发送`ISA_NAVI`意图 → 直接触发`ISANaviService` 3. USB设备插拔事件 → `USBReceiver`启动相关逻辑 - **JNI初始化时机**: - 在`ISANaviApplication`加载时通过`System.loadLibrary()`触发C++层`JNI_OnLoad()` - 首次调用`native`方法时绑定Java与C++函数 ### 示例调用链 ```bash 系统启动 → BootCompleteReceive.onReceive() ↓ 启动ISANaviService → Service.onCreate() ↓ 加载native-lib.so → C++全局对象构造函数/JNI_OnLoad() ↓ 通过Binder或Intent触发其他模块 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值