{"id":1005,"date":"2017-03-30T11:26:26","date_gmt":"2017-03-30T03:26:26","guid":{"rendered":"http:\/\/www.yusian.com\/blog\/?p=1005"},"modified":"2017-03-30T11:26:26","modified_gmt":"2017-03-30T03:26:26","slug":"android%e5%bc%80%e5%8f%91%e5%9f%ba%e6%9c%ac%e6%8e%a7%e4%bb%b6appwidget%e7%9a%84%e5%9f%ba%e6%9c%ac%e4%bd%bf%e7%94%a8","status":"publish","type":"post","link":"https:\/\/www.yusian.com\/blog\/android\/2017\/03\/30\/1126261005.html","title":{"rendered":"Android\u5f00\u53d1\u57fa\u672c\u63a7\u4ef6AppWidget\u7684\u57fa\u672c\u4f7f\u7528"},"content":{"rendered":"<p>1\u3001\u5148\u4e0a\u56fe\uff0c\u518d\u8bf4\u8bdd<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.yusian.com\/blog\/wp-content\/uploads\/2017\/03\/device-2017-03-30-111302.png\" alt=\"\" width=\"300\" height=\"533\" class=\"alignnone size-full wp-image-1006\" \/> <img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.yusian.com\/blog\/wp-content\/uploads\/2017\/03\/device-2017-03-30-111330.png\" alt=\"\" width=\"300\" height=\"533\" class=\"alignnone size-medium wp-image-1007\" \/><\/p>\n<p>2\u3001\u8bbe\u8ba1\u4e0e\u5b9e\u73b0<br \/>\n2.1\u3001App Widget\u5373\u6211\u4eec\u5e38\u8bf4\u7684\u684c\u9762\u63d2\u4ef6\u6216\u53eb\u201c\u5c0f\u5de5\u5177\u201d\uff1b<br \/>\n2.2\u3001\u4e0a\u56fe\u4e2d\u5373\u4e3a\u6211\u4eec\u9700\u8981\u5b9e\u73b0\u7684\u5c0f\u5de5\u5177\uff0c\u9762\u677f\u4e2d\u4e00\u4e2a\u6309\u94ae\u4e00\u4e2a\u6587\u672c\u6846\uff1b<br \/>\n2.3\u3001\u9700\u8981\u5b9e\u73b0\u7684\u529f\u80fd\u662f\u70b9\u51fb\u6309\u94ae\u80fd\u5c06\u6587\u672c\u6846\u4e2d\u7684\u6587\u5b57\u6539\u6210\u540e\u8005\uff1b<\/p>\n<p>2.4\u3001App Widget\u6838\u5fc3\u7c7b\u662fAppWidgetProvider\uff0c\u4e0e\u4e4b\u5173\u8054\u7684\u8fd8\u6709\u4e24\u4e2aXML\uff1b<br \/>\n2.5\u3001\u4e00\u4e2aXML\u4e3aApp Widget\u63d0\u4f9b\u57fa\u672c\u5c5e\u6027(\u6570\u636e\u5c42\u9762\u7684\u5c5e\u6027new_app_widget_info.xml)\uff1b<br \/>\n2.6\u3001\u53e6\u4e00\u4e2aXML\u4e3aApp Widget\u63d0\u4f9b\u5e03\u5c40\u63cf\u8ff0new_app_widget.xml\uff1b<br \/>\n2.7\u3001\u9664\u6b64\u4e4b\u5916\u8fd8\u8981\u5728AndroidManifest.xml\u4e2d\u6ce8\u518c\uff0c\u6ce8\u518c\u4e00\u4e2areciver\uff1b<\/p>\n<p>2.8\u3001\u503c\u5f97\u4e00\u63d0\u7684\u662fApp Widget\u7684\u6838\u5fc3\u7c7b\u7ee7\u627f\u81eaBroadcastReceiver\uff0c\u5373App Widget\u5b9e\u73b0\u662f\u57fa\u4e8e\u5e7f\u64ad\u7684\uff1b<br \/>\n2.9\u3001Andoid Studio\u76f4\u63a5\u65b0\u5efa\u4e00\u4e2aApp Widget\u7c7b\u4f1a\u5e2e\u6211\u4eec\u81ea\u52a8\u5c06\u4e0a\u8ff0\u591a\u4e2a\u6587\u4ef6\u90fd\u81ea\u52a8\u521b\u5efa\u597d\uff1b<\/p>\n<p>3\u3001\u5173\u952e\u4ee3\u7801<!--more--><br \/>\nAndroidManifest.xml<\/p>\n<pre line=\"1\" lang=\"java\"><?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http:\/\/schemas.android.com\/apk\/res\/android\"\n    package=\"com.yusian.widget\">\n\n    <application\n        android:allowBackup=\"true\"\n        android:icon=\"@mipmap\/ic_launcher\"\n        android:label=\"@string\/app_name\"\n        android:supportsRtl=\"true\"\n        android:theme=\"@style\/AppTheme\">\n        <activity android:name=\".MainActivity\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\" \/>\n\n                <category android:name=\"android.intent.category.LAUNCHER\" \/>\n            <\/intent-filter>\n        <\/activity>\n\n        <receiver android:name=\".NewAppWidget\">\n            <!--\u6ce8\u518cwidget\uff0cwidget\u672c\u8eab\u5b9e\u73b0\u4e5f\u662f\u57fa\u4e8e\u5e7f\u64ad-->\n            <intent-filter>\n                <action android:name=\"android.appwidget.action.APPWIDGET_UPDATE\" \/>\n            <\/intent-filter>\n\n            <!--\u6ce8\u518c\u5e7f\u64ad-->\n            <intent-filter>\n                <action android:name=\"com.yusian.widget.broadcast\"\/>\n            <\/intent-filter>\n\n            <meta-data\n                android:name=\"android.appwidget.provider\"\n                android:resource=\"@xml\/new_app_widget_info\" \/>\n        <\/receiver>\n    <\/application>\n\n<\/manifest><\/pre>\n<p>new_app_widget_info.xml<\/p>\n<pre line=\"1\" lang=\"java\"><?xml version=\"1.0\" encoding=\"utf-8\"?>\n<appwidget-provider xmlns:android=\"http:\/\/schemas.android.com\/apk\/res\/android\"\n    android:initialKeyguardLayout=\"@layout\/new_app_widget\"\n    android:initialLayout=\"@layout\/new_app_widget\"\n    android:minHeight=\"40dp\"\n    android:minWidth=\"360dp\"\n    android:previewImage=\"@drawable\/example_appwidget_preview\"\n    android:resizeMode=\"horizontal|vertical\"\n    android:updatePeriodMillis=\"86400000\"\n    android:widgetCategory=\"home_screen\">\n\n<\/appwidget-provider><\/pre>\n<p>new_app_widget.xml<\/p>\n<pre line=\"1\" lang=\"java\"><LinearLayout xmlns:android=\"http:\/\/schemas.android.com\/apk\/res\/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:background=\"#09C\"\n    android:orientation=\"vertical\">\n\n    <TextView\n        android:id=\"@+id\/appwidget_text\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_centerHorizontal=\"true\"\n        android:layout_centerVertical=\"true\"\n        android:layout_margin=\"8dp\"\n        android:background=\"#09C\"\n        android:contentDescription=\"@string\/appwidget_text\"\n        android:text=\"@string\/appwidget_text\"\n        android:textColor=\"#ffffff\"\n        android:textSize=\"24sp\"\n        android:textStyle=\"bold|italic\" \/>\n    <Button\n        android:id=\"@+id\/btn_widget\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"60dp\"\n        android:text=\"\u6309\u94ae\"\/>\n\n<\/LinearLayout><\/pre>\n<p>NewAppWidget<\/p>\n<pre line=\"1\" lang=\"java\">package com.yusian.widget;\n\nimport android.app.PendingIntent;\nimport android.appwidget.AppWidgetManager;\nimport android.appwidget.AppWidgetProvider;\nimport android.content.ComponentName;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.util.Log;\nimport android.widget.RemoteViews;\n\n\/**\n * Implementation of App Widget functionality.\n *\/\npublic class NewAppWidget extends AppWidgetProvider {\n    private final static String UPDATE_ACTION = \"com.yusian.widget.broadcast\";\n    @Override\n    public void onReceive(Context context, Intent intent) {\n        Log.d(\"SALog\", \"onReceive: \" + intent.getAction());\n        \/\/ \u54cd\u5e94UPDATE_ACTION\u5e7f\u64ad\u4e8b\u4ef6\n        if (intent.getAction().equals(UPDATE_ACTION)) {\n            \/\/ 1\u3001\u5185\u5bb9\u53d8\u66f4\n            RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.new_app_widget);\n            remoteViews.setTextViewText(R.id.appwidget_text, \"AppWidgetText\");\n            \/\/ 2\u3001\u66f4\u65b0\u89c6\u56fe\n            AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);\n            ComponentName componentName = new ComponentName(context, this.getClass());\n            appWidgetManager.updateAppWidget(componentName, remoteViews);\n        }else{\n            super.onReceive(context, intent);\n        }\n    }\n\n    @Override\n    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {\n        \/\/ There may be multiple widgets active, so update all of them\n        for (int i = 0; i < appWidgetIds.length; i++) {\n\n            updateAppWidget(context, appWidgetManager, appWidgetIds[i]);\n            \/\/ 1\u3001\u70b9\u51fb\u6309\u952e\u4e8b\u4ef6\u6253\u5f00\u5f53\u524d\u63a7\u5236\u5668\n            \/\/ Intent intent = new Intent(context, MainActivity.class);\n            \/\/ PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);\n            \/\/ 2\u3001\u70b9\u51fb\u6309\u94ae\u4e8b\u4ef6\u53d1\u9001\u4e00\u4e2a\u5e7f\u64ad\n            Intent intent = new Intent();\n            intent.setAction(UPDATE_ACTION);\n            \/\/ \u5c06Intent\u5305\u542b\u5230\u4e00\u4e2aPendingIntent\u5185\n            PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);\n            \/\/ \u627e\u5230\u76f8\u5bf9\u5e94\u7684widget\u7ed1\u5b9aPendingIntent\n            RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.new_app_widget);\n            remoteViews.setOnClickPendingIntent(R.id.btn_widget, pendingIntent);\n            \/\/ \u5c06widgetManager\u66f4\u65b0\u76f8\u5173\u4e8b\u4ef6\n            appWidgetManager.updateAppWidget(appWidgetIds[i], remoteViews);\n        }\n        super.onUpdate(context, appWidgetManager, appWidgetIds);\n        Log.d(\"SALog\", \"onUpdate: \");\n    }\n\n    static void updateAppWidget(Context context, AppWidgetManager appWidgetManager,\n                                int appWidgetId) {\n\n        CharSequence widgetText = context.getString(R.string.appwidget_text);\n        \/\/ Construct the RemoteViews object\n        RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.new_app_widget);\n        views.setTextViewText(R.id.appwidget_text, widgetText);\n\n        \/\/ Instruct the widget manager to update the widget\n        appWidgetManager.updateAppWidget(appWidgetId, views);\n    }\n\n    @Override\n    public void onEnabled(Context context) {\n        \/\/ Enter relevant functionality for when the first widget is created\n        Log.d(\"SALog\", \"onEnabled: \");\n    }\n\n    @Override\n    public void onDeleted(Context context, int[] appWidgetIds) {\n        super.onDeleted(context, appWidgetIds);\n        Log.d(\"SALog\", \"onDeleted: \");\n    }\n\n    @Override\n    public void onDisabled(Context context) {\n        \/\/ Enter relevant functionality for when the last widget is disabled\n        Log.d(\"SALog\", \"onDisabled: \");\n    }\n}<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>1\u3001\u5148\u4e0a\u56fe\uff0c\u518d\u8bf4\u8bdd 2\u3001\u8bbe\u8ba1\u4e0e\u5b9e\u73b0 2.1\u3001App Widget\u5373\u6211\u4eec\u5e38\u8bf4\u7684\u684c\u9762\u63d2\u4ef6\u6216\u53eb\u201c\u5c0f\u5de5\u5177\u201d\uff1b 2.2\u3001\u4e0a\u56fe\u4e2d\u5373\u4e3a\u6211\u4eec\u9700\u8981\u5b9e\u73b0\u7684\u5c0f\u5de5\u5177\uff0c\u9762\u677f\u4e2d\u4e00\u4e2a\u6309\u94ae\u4e00\u4e2a\u6587\u672c\u6846\uff1b 2.3\u3001\u9700\u8981\u5b9e\u73b0\u7684\u529f\u80fd\u662f\u70b9\u51fb\u6309\u94ae\u80fd\u5c06\u6587\u672c\u6846\u4e2d\u7684\u6587\u5b57\u6539\u6210\u540e\u8005\uff1b 2.4\u3001App Widget\u6838\u5fc3\u7c7b\u662fAppWidgetProvider\uff0c\u4e0e\u4e4b\u5173\u8054\u7684\u8fd8\u6709\u4e24\u4e2aXML\uff1b 2.5\u3001\u4e00\u4e2aXML\u4e3aApp Widget\u63d0\u4f9b\u57fa\u672c\u5c5e\u6027(\u6570\u636e\u5c42\u9762\u7684\u5c5e\u6027new_app_widget_info.xml)\uff1b 2.6\u3001\u53e6\u4e00\u4e2aXML\u4e3aApp Widget\u63d0\u4f9b\u5e03\u5c40\u63cf\u8ff0new_app_widget.xml\uff1b 2.7\u3001\u9664\u6b64\u4e4b\u5916\u8fd8\u8981\u5728AndroidManifest.xml\u4e2d\u6ce8\u518c\uff0c\u6ce8\u518c\u4e00\u4e2areciver\uff1b 2.8\u3001\u503c\u5f97\u4e00\u63d0\u7684\u662fApp Widget\u7684\u6838\u5fc3\u7c7b\u7ee7\u627f\u81eaBroadcastReceiver\uff0c\u5373App Widget\u5b9e\u73b0\u662f\u57fa\u4e8e\u5e7f\u64ad\u7684\uff1b 2.9\u3001Andoid Studio\u76f4\u63a5\u65b0\u5efa\u4e00\u4e2aApp Widget\u7c7b\u4f1a\u5e2e\u6211\u4eec\u81ea\u52a8\u5c06\u4e0a\u8ff0\u591a\u4e2a\u6587\u4ef6\u90fd\u81ea\u52a8\u521b\u5efa\u597d\uff1b 3\u3001\u5173\u952e\u4ee3\u7801<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[30],"tags":[33],"class_list":["post-1005","post","type-post","status-publish","format-standard","hentry","category-android","tag-33"],"_links":{"self":[{"href":"https:\/\/www.yusian.com\/blog\/wp-json\/wp\/v2\/posts\/1005","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.yusian.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.yusian.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.yusian.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.yusian.com\/blog\/wp-json\/wp\/v2\/comments?post=1005"}],"version-history":[{"count":0,"href":"https:\/\/www.yusian.com\/blog\/wp-json\/wp\/v2\/posts\/1005\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.yusian.com\/blog\/wp-json\/wp\/v2\/media?parent=1005"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.yusian.com\/blog\/wp-json\/wp\/v2\/categories?post=1005"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.yusian.com\/blog\/wp-json\/wp\/v2\/tags?post=1005"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}