Google I/O 2013 最佳实践(2) - AndroidManifest篇

<!--
  Copyright 2011 Google Inc.

  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
  -->

<manifest
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.google.android.apps.iosched"
    android:versionCode="110"
    android:versionName="1.1.0"
    android:installLocation="auto">

    <uses-sdk
        android:minSdkVersion="10"
        android:targetSdkVersion="19" />

    <permission
        android:name="com.google.android.apps.iosched.permission.WRITE_SCHEDULE"
        android:protectionLevel="normal"
        android:label="@string/permission_write"
        android:description="@string/permission_write" />

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.USE_CREDENTIALS" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_SYNC_SETTINGS" />
    <uses-permission android:name="android.permission.READ_SYNC_STATS" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.NFC" />
    <!-- required for YouTube -->
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
    <!-- required for setIsSyncable -->
    <uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS" />
    <!-- required for GCM -->
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission
            android:name="com.google.android.c2dm.permission.RECEIVE" />
    <permission
            android:name="com.google.android.apps.iosched.permission.C2D_MESSAGE"
            android:protectionLevel="signature" />
    <uses-permission
            android:name="com.google.android.apps.iosched.permission.C2D_MESSAGE" />

    <!-- required for MapView v2 -->
    <permission
        android:name="com.google.android.apps.iosched.permission.MAPS_RECEIVE"
        android:protectionLevel="signature"/>
    <uses-permission android:name="com.google.android.apps.iosched.permission.MAPS_RECEIVE"/>
    <uses-feature
        android:glEsVersion="0x00020000"
        android:required="true"/>

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"/>
    <uses-feature
        android:name="android.hardware.location"
        android:required="false" />
    <uses-feature
        android:name="android.hardware.location.gps"
        android:required="false" />

    <application
        android:label="@string/app_name"
        android:icon="@drawable/ic_launcher"
        android:logo="@drawable/actionbar_logo"
        android:theme="@style/Theme.IOSched"
        android:hardwareAccelerated="true"
        android:allowBackup="true"
        android:supportsRtl="true">

        <!-- MapView v2 API -->
        <meta-data
            android:name="com.google.android.maps.v2.API_KEY"
            android:value="@string/maps_api_key"/>

        <!-- Activities for both phones and tablets -->

        <activity
            android:name=".ui.AccountActivity"
            android:label="@string/app_name"
            android:theme="@style/Theme.IOSched.Accounts"
            android:configChanges="orientation|keyboardHidden" />

        <activity
            android:name=".ui.HomeActivity"
            android:label="@string/app_name"
            android:theme="@style/Theme.IOSched.Home">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity
            android:name=".ui.SocialStreamActivity"
            android:label="@string/title_tagstream"
            android:theme="@style/Theme.IOSched.PlusStream"
            android:parentActivityName=".ui.HomeActivity">
            <meta-data android:name="android.support.PARENT_ACTIVITY"
                android:value=".ui.HomeActivity" />
        </activity>

        <activity
            android:name=".ui.AnnouncementsActivity"
            android:label="@string/title_announcements"
            android:theme="@style/Theme.IOSched.PlusStream"
            android:parentActivityName=".ui.HomeActivity">
            <meta-data android:name="android.support.PARENT_ACTIVITY"
                android:value=".ui.HomeActivity" />
        </activity>

        <activity
            android:name=".ui.SearchActivity"
            android:label="@string/title_search"
            android:launchMode="singleTop"
            android:theme="@style/Theme.IOSched.GreyBackground"
            android:parentActivityName=".ui.HomeActivity">
            <intent-filter>
                <action android:name="android.intent.action.SEARCH" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
            <meta-data android:name="android.app.searchable" android:resource="@xml/searchable" />
            <meta-data android:name="android.support.PARENT_ACTIVITY"
                android:value=".ui.HomeActivity" />
        </activity>

        <activity android:name=".ui.SessionLivestreamActivity"
            android:label="@string/session_livestream_title"
            android:configChanges="orientation|screenSize"
            android:theme="@style/Theme.IOSched.Livestream"
            android:parentActivityName=".ui.HomeActivity">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
            <meta-data android:name="android.support.PARENT_ACTIVITY"
                android:value=".ui.HomeActivity" />
        </activity>

        <activity
            android:name=".ui.SettingsActivity"
            android:label="@string/title_settings"
            android:theme="@style/Theme.IOSched"
            android:parentActivityName=".ui.HomeActivity">
            <meta-data android:name="android.support.PARENT_ACTIVITY"
                android:value=".ui.HomeActivity" />
        </activity>

        <activity
            android:name=".ui.NfcBadgeActivity"
            android:theme="@android:style/Theme.NoDisplay">
            <intent-filter android:priority="-999">
                <action android:name="android.nfc.action.NDEF_DISCOVERED" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:scheme="https" android:host="plus.google.com" />
            </intent-filter>
        </activity>

        <!-- Phone-only activities -->

        <activity
            android:name=".ui.phone.SessionsActivity"
            android:label="@string/title_sessions"
            android:parentActivityName=".ui.HomeActivity">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="vnd.android.cursor.dir/vnd.iosched.session" />
            </intent-filter>
            <!-- HomeActivity and not TrackDetailActivity is the parent because SessionsActivity
              is not used to show sessions for a given track. -->
            <meta-data android:name="android.support.PARENT_ACTIVITY"
                android:value=".ui.HomeActivity" />
            <meta-data android:name="com.google.android.apps.iosched.meta.TARGET_FORM_FACTOR"
                android:value="handset" />
        </activity>

        <activity
            android:name=".ui.phone.TrackDetailActivity"
            android:label="@string/title_tracks"
            android:theme="@style/Theme.IOSched.GreyBackground"
            android:parentActivityName=".ui.HomeActivity">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="vnd.android.cursor.item/vnd.iosched.track" />
            </intent-filter>
            <meta-data android:name="android.support.PARENT_ACTIVITY"
                android:value=".ui.HomeActivity" />
            <meta-data android:name="com.google.android.apps.iosched.meta.TARGET_FORM_FACTOR"
                android:value="handset" />
        </activity>

        <activity android:name=".ui.phone.SessionDetailActivity"
            android:label="@string/title_session_detail"
            android:uiOptions="splitActionBarWhenNarrow"
            android:parentActivityName=".ui.phone.SessionsActivity">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="vnd.android.cursor.item/vnd.iosched.session" />
            </intent-filter>
            <!-- Android Beam for session details -->
            <intent-filter>
                <action android:name="android.nfc.action.NDEF_DISCOVERED" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="vnd.android.cursor.item/vnd.iosched.session" />
            </intent-filter>
            <!-- Web URLs -->
            <intent-filter android:label="@string/app_name">
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <data android:scheme="https"
                    android:host="developers.google.com"
                    android:pathPrefix="/events/io/sessions/" />
            </intent-filter>
            <!-- PARENT_ACTIVITY alone is insufficient for Up navigation for this activity -->
            <meta-data android:name="android.support.PARENT_ACTIVITY"
                android:value=".ui.phone.SessionsActivity" />
            <meta-data android:name="com.google.android.apps.iosched.meta.TARGET_FORM_FACTOR"
                android:value="handset" />
        </activity>

        <activity android:name=".ui.SessionFeedbackActivity"
            android:label="@string/title_session_feedback">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="vnd.android.cursor.item/vnd.iosched.session_feedback" />
            </intent-filter>
            <!-- PARENT_ACTIVITY alone is insufficient for Up navigation for this activity -->
            <meta-data android:name="android.support.PARENT_ACTIVITY"
                android:value=".ui.phone.SessionsActivity" />
        </activity>


        <activity android:name=".ui.phone.SandboxDetailActivity"
            android:label="@string/title_sandbox_detail"
            android:parentActivityName=".ui.phone.TrackDetailActivity">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="vnd.android.cursor.item/vnd.iosched.sandbox" />
            </intent-filter>
            <!-- PARENT_ACTIVITY alone is insufficient for Up navigation for this activity -->
            <meta-data android:name="android.support.PARENT_ACTIVITY"
                android:value=".ui.phone.TrackDetailActivity" />
            <meta-data android:name="com.google.android.apps.iosched.meta.TARGET_FORM_FACTOR"
                android:value="handset" />
        </activity>

        <activity
            android:name=".ui.phone.MapActivity"
            android:label="@string/title_map"
            android:configChanges="orientation|keyboardHidden"
            android:parentActivityName=".ui.HomeActivity">
            <meta-data android:name="android.support.PARENT_ACTIVITY"
                android:value=".ui.HomeActivity" />
            <meta-data android:name="com.google.android.apps.iosched.meta.TARGET_FORM_FACTOR"
                android:value="handset" />
        </activity>

        <!-- Tablet-only activities -->

        <activity
            android:name=".ui.tablet.SessionsSandboxMultiPaneActivity"
            android:label="@string/app_name"
            android:theme="@style/Theme.IOSched.GreyBackground"
            android:parentActivityName=".ui.HomeActivity">
            <!-- can show track details -->
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="vnd.android.cursor.item/vnd.iosched.track" />
            </intent-filter>
            <!-- can show session and sandbox company lists -->
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="vnd.android.cursor.dir/vnd.iosched.session" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="vnd.android.cursor.dir/vnd.iosched.sandbox" />
            </intent-filter>
            <!-- can show session and sandbox company details -->
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="vnd.android.cursor.item/vnd.iosched.session" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="vnd.android.cursor.item/vnd.iosched.sandbox" />
            </intent-filter>
            <!-- Android Beam for session details -->
            <intent-filter>
                <action android:name="android.nfc.action.NDEF_DISCOVERED" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="vnd.android.cursor.item/vnd.iosched.session" />
            </intent-filter>
            <!-- Web URLs -->
            <intent-filter android:label="@string/app_name">
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <data android:scheme="https"
                    android:host="developers.google.com"
                    android:pathPrefix="/events/io/sessions/" />
            </intent-filter>
            <meta-data android:name="android.support.PARENT_ACTIVITY"
                android:value=".ui.HomeActivity" />
            <meta-data android:name="com.google.android.apps.iosched.meta.TARGET_FORM_FACTOR"
                android:value="tablet" />
        </activity>

        <activity
            android:name=".ui.tablet.MapMultiPaneActivity"
            android:label="@string/title_map"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:parentActivityName=".ui.HomeActivity">
            <meta-data android:name="android.support.PARENT_ACTIVITY"
                android:value=".ui.HomeActivity" />
            <meta-data android:name="com.google.android.apps.iosched.meta.TARGET_FORM_FACTOR"
                android:value="tablet" />
        </activity>

        <!-- TaskStackBuilder proxy activity for widgets and notifications. -->

        <activity
            android:name=".ui.TaskStackBuilderProxyActivity"
            android:theme="@android:style/Theme.NoDisplay" />

        <!-- Session alarm/calendar integrating components. -->
        <receiver android:name=".receiver.SessionAlarmReceiver" >
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <action android:name="com.google.android.apps.iosched.action.UPDATE_CALENDAR_COMPLETED" />
            </intent-filter>
        </receiver>

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

        <!-- Used for install referral measurement-->
        <service android:name="com.google.analytics.tracking.android.CampaignTrackingService" />
        <receiver
            android:name="com.google.analytics.tracking.android.CampaignTrackingReceiver"
            android:exported="true">
            <intent-filter>
                <action android:name="com.android.vending.INSTALL_REFERRER" />
            </intent-filter>
        </receiver>

        <!--
          BroadcastReceiver that will receive the C2DM messages from GCM
          services and handle them to the custom IntentService.

          The com.google.android.c2dm.permission.SEND permission is necessary
          so only GCM services can send data messages for the app.
        -->
        <receiver android:name=".gcm.GCMRedirectedBroadcastReceiver"
            android:permission="com.google.android.c2dm.permission.SEND">
            <intent-filter>
                <!-- Receives the actual messages. -->
                <action android:name="com.google.android.c2dm.intent.RECEIVE" />
                <!-- Receives the registration id. -->
                <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
                <category android:name="com.google.android.apps.iosched" />
            </intent-filter>
        </receiver>

        <!--
          Application-specific subclass of GCMBaseIntentService that will
          handle received messages.

          By default, it must be named .GCMIntentService, unless the
          application uses a custom BroadcastReceiver that redefines its name.
        -->
        <service android:name=".gcm.GCMIntentService" />

        <!-- Data, sync and schedule editing components -->

        <provider
            android:name=".provider.ScheduleProvider"
            android:authorities="com.google.android.apps.iosched"
            android:writePermission="com.google.android.apps.iosched.permission.WRITE_SCHEDULE"
            android:syncable="true"
            android:label="@string/app_name"
            android:exported="true" />

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

        <service android:name=".sync.SyncService"
            android:exported="true"
            tools:ignore="ExportedService">
            <intent-filter>
                <action android:name="android.content.SyncAdapter" />
            </intent-filter>
            <meta-data android:name="android.content.SyncAdapter"
                android:resource="@xml/syncadapter" />
        </service>

        <!-- a simple receiver that triggers a sync for any message it receives. used by our
             GCM implementation -->
        <receiver android:name=".sync.TriggerSyncReceiver" />

        <!-- Other manifest items -->

        <meta-data
            android:name="android.app.default_searchable"
            android:value=".ui.SearchActivity" />

        <!-- App widget components -->

        <receiver android:name=".appwidget.ScheduleWidgetProvider"
            android:enabled="@bool/has_honeycomb">
            <intent-filter>
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
            </intent-filter>
            <!-- This specifies the widget provider info -->
            <meta-data android:name="android.appwidget.provider"
                android:resource="@xml/widgetinfo" />
        </receiver>

        <!-- The service serving the RemoteViews to the collection widget -->

        <service android:name=".appwidget.ScheduleWidgetRemoteViewsService"
            android:permission="android.permission.BIND_REMOTEVIEWS"
            android:exported="false"
            android:enabled="@bool/has_honeycomb" />

        <!-- DashClock extension -->
        <service android:name=".service.DashClockExtension"
            android:icon="@drawable/dashclock_extension"
            android:label="@string/app_name"
            android:permission="com.google.android.apps.dashclock.permission.READ_EXTENSION_DATA">
            <intent-filter>
                <action android:name="com.google.android.apps.dashclock.Extension" />
            </intent-filter>
            <meta-data android:name="protocolVersion" android:value="1" />
            <meta-data android:name="description"
                android:value="@string/dashclock_extension_description" />
        </service>
    </application>
</manifest>


android:installLocation="auto"

App安装在内置或外置SD卡上,默认为内置,此处设置为自动


<uses-feature />

用来过滤一些硬件不支持的设备,比如过滤不支持前置摄像头/不支持GPS的设备,不允许其安装。


android:logo="@drawable/actionbar_logo"

就是ActionBar左上角默认的logo图片


android:allwoBackup="true"

是否支持系统原生的备份功能,默认为true


剩下的没什么好说了,就不介绍了

Google I/O 2013 最佳实践(2) - AndroidManifest篇,,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。