2012年5月7日 星期一

[Android]AppWidget 呼叫 Activity, then Activity 傳送資料給 AppWidget

步驟一:新增 AppWidget至首頁畫面



步驟二:點選 Appwidget 內的文字,以啟動另一個 Activity

步驟三:選擇其中一個項目

步驟四:將選擇的項目資料顯示於 AppWidget

步驟五:移除 AppWidget

<AppWidgetInvokeActivity.java>
   1: package com.android.appwidgetinvokeactivity;
   2:  
   3: import android.app.PendingIntent;
   4: import android.app.Service;
   5: import android.appwidget.AppWidgetManager;
   6: import android.appwidget.AppWidgetProvider;
   7: import android.content.ComponentName;
   8: import android.content.Context;
   9: import android.content.Intent;
  10: import android.os.IBinder;
  11: import android.widget.RemoteViews;
  12:  
  13: public class AppWidgetInvokeActivity extends AppWidgetProvider {
  14:  
  15:     @Override
  16:     public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
  17:         super.onUpdate(context, appWidgetManager, appWidgetIds);
  18:         
  19:         // Start UpdateService Service 
  20:         context.startService(new Intent(context, UpdateService.class));
  21:         
  22:         int appWidgetId = appWidgetIds[0];
  23:         Intent configIntent = new Intent(context, MyActivity.class);
  24:         PendingIntent configPendingIntent = PendingIntent.getActivity(context, 0, configIntent, 0);
  25:         RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widgetlayout);
  26:         remoteViews.setOnClickPendingIntent(R.id.resultTextView, configPendingIntent);
  27:         appWidgetManager.updateAppWidget(appWidgetId, remoteViews);
  28:     }
  29:     
  30:     
  31:     @Override
  32:     public void onDisabled(Context context) {
  33:     // 處理 AppWidget onDisabled 事件
  34:     // 當最後一個  AppWidget 被刪除時,會執行 onDisabled
  35:         
  36:         super.onDisabled(context);
  37:        
  38:         // 停止 UpdateService 服務
  39:         context.stopService(new Intent(context, UpdateService.class));
  40:         
  41:         android.os.Process.killProcess(android.os.Process.myPid());
  42:     }
  43:  
  44:     
  45:     public static class UpdateService extends Service {
  46:  
  47:         @Override
  48:         public IBinder onBind(Intent intent) {
  49:             // TODO Auto-generated method stub
  50:             return null;
  51:         }
  52:  
  53:         @Override
  54:         public void onStart(Intent intent, int startId) {
  55:             super.onStart(intent, startId);
  56:             
  57:             // 將 MyActivity 設定的 selectedItem 值,更新 AppWidget 內容值
  58:             RemoteViews updateViews = new RemoteViews(this.getPackageName(), R.layout.widgetlayout);
  59:             updateViews.setTextViewText(R.id.resultTextView, "點選這裡選擇設定項目"+"\n"+MyActivity.selectedItem);
  60:             ComponentName thisWidget = new ComponentName(this, AppWidgetInvokeActivity.class);
  61:             AppWidgetManager manager = AppWidgetManager.getInstance(this);
  62:             manager.updateAppWidget(thisWidget, updateViews);
  63:         }
  64:     }
  65:          
  66: }

<MyActivity.java>
   1: package com.android.appwidgetinvokeactivity;
   2:  
   3: import android.app.Activity;
   4: import android.content.Context;
   5: import android.content.Intent;
   6: import android.os.Bundle;
   7: import android.view.View;
   8: import android.widget.AdapterView;
   9: import android.widget.ArrayAdapter;
  10: import android.widget.ListAdapter;
  11: import android.widget.ListView;
  12: import android.widget.AdapterView.OnItemClickListener;
  13:  
  14: public class MyActivity extends Activity {
  15:     
  16:     public static String selectedItem = "";
  17:     ListView listviewSourceFrom;
  18:     ListAdapter laSingleChoice;
  19:     static final String[] mSourceFrom = new String[] {  "選擇項目-1",
  20:                                                         "選擇項目-2",
  21:                                                         "選擇項目-3" };
  22:     
  23:     
  24:     @Override
  25:     protected void onCreate(Bundle savedInstanceState) {
  26:         super.onCreate(savedInstanceState);
  27:         setContentView(R.layout.myactivitylayout);
  28:         findViews();
  29:         setListviewControls();
  30:         setListviewListener();
  31:     }
  32:     
  33:     private void findViews() {
  34:         listviewSourceFrom = (ListView) findViewById(R.id.sourcefromListview);
  35:     }
  36:     
  37:     private void setListviewControls() {
  38:         laSingleChoice = new ArrayAdapter<String>(    this,
  39:                                                 android.R.layout.simple_list_item_single_choice,
  40:                                                 mSourceFrom);
  41:         listviewSourceFrom.setAdapter(laSingleChoice);
  42:         listviewSourceFrom.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
  43:     }
  44:     
  45:     private void setListviewListener() {
  46:         listviewSourceFrom.setOnItemClickListener(new OnItemClickListener() {  
  47:             public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
  48:                 selectedItem = "選擇了第 "+String.valueOf(arg2+1)+" 個項目";
  49:                 final Context context = MyActivity.this;
  50:                 context.startService(new Intent(context, AppWidgetInvokeActivity.UpdateService.class));
  51:                 Intent resultValue = new Intent();
  52:                 setResult(RESULT_OK, resultValue);
  53:                 finish();
  54:             }
  55:         });  
  56:     }
  57:  
  58: }

<widgetlayout.xml>
   1: <?xml version="1.0" encoding="utf-8"?>
   2: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   3:     android:layout_width="wrap_content"
   4:     android:layout_height="wrap_content"
   5:     android:gravity="center"
   6:     android:orientation="vertical" >
   7:  
   8:     <TextView
   9:         android:id="@+id/resultTextView"
  10:         android:layout_width="match_parent"
  11:         android:layout_height="match_parent"
  12:         android:background="@drawable/widget"
  13:         android:gravity="center"
  14:         android:text="@string/app_name"
  15:         android:textColor="@android:color/black"
  16:         android:textSize="12dp"
  17:         android:typeface="serif" />
  18:  
  19: </LinearLayout>

<myactivitylayout.xml>
   1: <?xml version="1.0" encoding="utf-8"?>
   2: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   3:     android:id="@+id/LinearLayout1"
   4:     android:layout_width="match_parent"
   5:     android:layout_height="match_parent" >
   6:  
   7:     <ListView
   8:         android:id="@+id/sourcefromListview"
   9:         android:layout_width="match_parent"
  10:         android:layout_height="wrap_content"
  11:         android:drawSelectorOnTop="true" >
  12:  
  13:     </ListView>
  14:  
  15: </LinearLayout>

<appwidget.xml>

   1: <?xml version="1.0" encoding="utf-8"?>
   2: <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
   3:         android:initialLayout="@layout/widgetlayout"
   4:         android:minWidth="176dp"
   5:         android:minHeight="72dp" >
   6:  
   7: </appwidget-provider> 

<AndroidManifest.xml>
   1: <?xml version="1.0" encoding="utf-8"?>
   2: <manifest xmlns:android="http://schemas.android.com/apk/res/android"
   3:     package="com.android.appwidgetinvokeactivity"
   4:     android:versionCode="1"
   5:     android:versionName="1.0" >
   6:  
   7:     <uses-sdk android:minSdkVersion="8" />
   8:  
   9:     <application
  10:         android:icon="@drawable/ic_launcher"
  11:         android:label="@string/app_name" >
  12:         <receiver android:name="AppWidgetInvokeActivity" android:label="@string/app_name">
  13:             <intent-filter>
  14:                 <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
  15:             </intent-filter>
  16:             <meta-data android:resource="@xml/appwidget" android:name="android.appwidget.provider"/>
  17:         </receiver>
  18:         <service android:name="AppWidgetInvokeActivity$UpdateService"/>
  19:         <activity android:name="MyActivity">
  20:             <intent-filter>
  21:                 <action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" />
  22:             </intent-filter>
  23:         </activity>
  24:     </application>
  25:  
  26: </manifest>

沒有留言:

張貼留言