1

Android 開発者の Web サイトでは、アプリ ウィジェットは次の組み合わせとして実装されます。

  1. AppWidgetProviderInfo オブジェクト
  2. AppWidgetProvider クラス
  3. 初期ビューのレイアウト

AndroidManifest.xml に表示されるアプリ ウィジェットの典型的な例は次のとおりです。

<receiver android:name="ExampleAppWidgetProvider" >   // item '2'
    <intent-filter>
        <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
    </intent-filter>
    <meta-data android:name="android.appwidget.provider"
               android:resource="@xml/example_appwidget_info" />   // item '1'
</receiver>

また、項目「1」は、多くの場合、項目「3」がどこにあるかを説明しています。

<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:minWidth="294dp"
    android:minHeight="72dp"
    android:updatePeriodMillis="86400000"
    android:previewImage="@drawable/preview"
    android:initialLayout="@layout/example_appwidget"    // item '3'
    android:configure="com.example.android.ExampleAppWidgetConfigure" 
    android:resizeMode="horizontal|vertical">
</appwidget-provider>

このような多くのアプリ ウィジェットの例を見てきました。

ただし、「AppWidget フレームワーク」が電話上のすべてのアプリ ウィジェットを検索し、メイン メニューの「ウィジェット」タブに配置するために使用する署名をまだ理解していません。

アプリがメイン メニューの [すべてのアプリ] タブに表示されるようにするには、アクティビティのインテント フィルターの 1 つに以下を追加します。

<category android:name="android.intent.category.LAUNCHER" />

しかし、アプリ ウィジェットに対応するマジック キーワードは何ですか? ランチャーはどのようにアプリ ウィジェットを認識し、それを [ウィジェット] タブに配置しますか?

おそらくアイテム 1、2、3 の署名が原因ではないことはわかっています。なぜなら、他の誰かが開発した古いアプリ ウィジェットに出くわし、1、2、3 のパターンが見えないからです。そして、「AppWidgetフレームワーク」がアプリウィジェットであることをどのように把握できるかわかりません。

古いアプリ ウィジェットのマニフェスト ファイルを以下に示します。手がかりを探す場所を指摘していただければ幸いです。

<?xml version="1.0" encoding="utf-8"?>
<manifest
    xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.weather">
    <uses-permission android:name="android.permission.WAKE_LOCK"/>
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.GET_TASKS" />
    <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
    <uses-permission android:name="com.android.launcher.permission.WRITE_SETTINGS" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <application
        android:process="com.example.weather.sinaweather" 
        android:label="@string/app_name"
        android:icon="@drawable/widget_weather_icon">

        <provider
            android:name=".provider.WeatherProvider"
            android:authorities="com.example.weather" />
        <activity
            android:name=".WeatherDetail"
            android:excludeFromRecents="true">
        </activity>        
        <activity
            android:name=".WeatherDetailActivity"
            android:launchMode="singleTop"
            android:excludeFromRecents="true"
            android:configChanges="orientation|screenSize|keyboardHidden|navigation">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity
            android:name=".AlertActivity"
            android:excludeFromRecents="true"
            android:theme="@android:style/Theme.Dialog">
            <intent-filter>
                <!--action android:name="android.intent.action.MAIN" /-->
                <!--category android:name="android.intent.category.LAUNCHER" /-->
            </intent-filter>
            <intent-filter>
                <action android:name="com.example.weather.action.START_WEATHER_SETTINGS" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
            <intent-filter>
                <action android:name="com.example.weather.action.START_WEATHER_APPLICATION" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
        <activity
            android:name=".WeatherDisplayCurrentDialog"
            android:excludeFromRecents="true"
            android:theme="@android:style/Theme.Dialog">
            <intent-filter>
                <action android:name="com.example.weather.DISPLAY_CURRENT_CONFIGURE" />
            </intent-filter>
        </activity>
        <activity
            android:name=".AddCityActivity"
            android:excludeFromRecents="true"
            android:configChanges="orientation|screenSize|keyboardHidden|navigation|locale">
            <intent-filter>
                <action android:name="com.example.weather.action.START_WEATHER_SETTINGS_INTELNAL" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter> 
        </activity>
        <activity
            android:name=".SearchCityActivity"
            android:excludeFromRecents="true"
            android:configChanges="orientation|screenSize|keyboardHidden|navigation">
        </activity>
        <service android:name=".WeatherService">
            <intent-filter>
                <action android:name="com.example.weather.INIT_APP" />
                <action android:name="com.example.weather.WEATHER_RETRY" />
                <action android:name="com.example.weather.RESET_AUTO_UPDATE_ALARM" />
                <action android:name="com.example.weather.WEATHER_AUTOUPDATE" />
                <action android:name="com.example.weather.action.NEED_WEATHER_INFO" />
                <action android:name="com.example.weather.action.TOP_CITY_CHANGED" />
                <action android:name="com.example.weather.LOCATION_UPDATE" />          
            </intent-filter>
        </service>

        <receiver
            android:name=".WeatherReceiver">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <action android:name="com.example.weather.RESTART_SERVICE" />
            </intent-filter>
        </receiver>

    </application>
</manifest>
4

1 に答える 1

0

ウィジェットの作成と宣言の詳細な手順については、この記事をお読みください。「1-2-3」パターンと呼ばれるものは、マニフェストで必要です。

于 2012-10-20T10:04:32.630 に答える