1. package com.jackie.ui;  
    2.
    3. import static android.util.Log.d;
    4. import android.app.Activity;
    5. import android.appwidget.AppWidgetHost;
    6. import android.appwidget.AppWidgetManager;
    7. import android.appwidget.AppWidgetProviderInfo;
    8. import android.content.Intent;
    9. import android.os.Bundle;
    10. import android.view.View;
    11. import android.view.View.OnLongClickListener;
    12. import android.widget.FrameLayout;
    13. import android.widget.FrameLayout.LayoutParams;
    14.
    15. /**
    16. * 在activity中,长按,弹出widget选择界面,
    17. * 选择的widget有配置就先弹出,
    18. * 创建widget的view 将view加载到 activity中
    19. */
    20. public class AddWidgetActivity extends Activity {
    21. private AppWidgetHost mAppWidgetHost;
    22. private AppWidgetManager mAppWidgetManager;
    23. private FrameLayout frameLayout;
    24. private static final int REQUEST_PICK_APPWIDGET = 1;
    25. private static final int REQUEST_CREATE_APPWIDGET = 2;
    26. private static final int APPWIDGET_HOST_ID = 0x100; //用于标识
    27. private static final String EXTRA_CUSTOM_WIDGET = "custom_widget";
    28.
    29. @Override
    30. public void onCreate(Bundle savedInstanceState) {
    31. super.onCreate(savedInstanceState);
    32.
    33. mAppWidgetManager = AppWidgetManager.getInstance(getApplicationContext());
    34. new AppWidgetHost(getApplicationContext(), APPWIDGET_HOST_ID);
    35. //开始监听widget的变化
    36. mAppWidgetHost.startListening();
    37.
    38. new FrameLayout(this);
    39. new OnLongClickListener() {
    40.
    41. @Override
    42. public boolean onLongClick(View v) {
    43. showWidgetChooser();
    44. return true;
    45. }
    46. });
    47. setContentView(frameLayout);
    48. }
    49.
    50. @Override
    51. protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    52. if (resultCode == RESULT_OK) {
    53. switch (requestCode) {
    54. case REQUEST_PICK_APPWIDGET:
    55. addAppWidget(data);
    56. break;
    57. case REQUEST_CREATE_APPWIDGET:
    58. completeAddAppWidget(data);
    59. break;
    60. }
    61. else if (requestCode == REQUEST_PICK_APPWIDGET &&
    62. null) {
    63. // Clean up the appWidgetId if we canceled
    64. int appWidgetId = data.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, -1);
    65. if (appWidgetId != -1) {
    66. mAppWidgetHost.deleteAppWidgetId(appWidgetId);
    67. }
    68. }
    69. }
    70.
    71. /**
    72. * 选中了某个widget之后,根据是否有配置来决定直接添加还是弹出配置activity
    73. * @param data
    74. */
    75. private void addAppWidget(Intent data) {
    76. int appWidgetId = data.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, -1);
    77.
    78. String customWidget = data.getStringExtra(EXTRA_CUSTOM_WIDGET);
    79. "addAppWidget", "data:"+ customWidget);
    80. if ("search_widget".equals(customWidget)) {
    81. //这里直接将search_widget删掉了
    82. mAppWidgetHost.deleteAppWidgetId(appWidgetId);
    83. else {
    84. AppWidgetProviderInfo appWidget = mAppWidgetManager.getAppWidgetInfo(appWidgetId);
    85.
    86. "addAppWidget", "configure:"+ appWidget.configure);
    87. if (appWidget.configure != null) {
    88. //有配置,弹出配置
    89. new Intent(AppWidgetManager.ACTION_APPWIDGET_CONFIGURE);
    90. intent.setComponent(appWidget.configure);
    91. intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
    92.
    93. startActivityForResult(intent, REQUEST_CREATE_APPWIDGET);
    94. else {
    95. //没有配置,直接添加
    96. completeAddAppWidget(data);
    97. }
    98. }
    99. }
    100.
    101. /**
    102. * 请求添加一个新的widget:用于选取系统中的widget
    103. */
    104. private void showWidgetChooser() {
    105. int appWidgetId = mAppWidgetHost.allocateAppWidgetId();
    106. new Intent(AppWidgetManager.ACTION_APPWIDGET_PICK);
    107. pickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
    108. startActivityForResult(pickIntent, REQUEST_PICK_APPWIDGET);
    109. }
    110.
    111. /**
    112. * 添加widget
    113. * @param data
    114. */
    115. private void completeAddAppWidget(Intent data) {
    116. Bundle extras = data.getExtras();
    117. int appWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, -1);
    118.
    119. "completeAddAppWidget", "dumping extras content="+extras.toString());
    120. "completeAddAppWidget", "appWidgetId:"+ appWidgetId);
    121. AppWidgetProviderInfo appWidgetInfo = mAppWidgetManager.getAppWidgetInfo(appWidgetId);
    122.
    123. this, appWidgetId, appWidgetInfo);
    124. new LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, appWidgetInfo.minHeight));
    125. frameLayout.addView(hostView);
    126. }
    127.
    128. }