我創建了appwidget(StackView小部件),我可以在StackView小部件中顯示圖像和文本。現在我想要的是,如果我單擊StackView小部件應該啓動新的活動,例如MainActivity.java。我寫了代碼,可以顯示吐司消息的小工具位置,但我不知道如何開始新的活動,而不是吐司消息。這是我的代碼Android appwidget開始新的活動
public class MyWidgetProvider extends AppWidgetProvider {
public static final String TOAST_ACTION = "com.example.android.stackwidget.TOAST_ACTION";
public static final String EXTRA_ITEM = "com.example.android.stackwidget.EXTRA_ITEM";
private RemoteViews views;
private Intent intent;
@Override
public void onDeleted(Context context, int[] appWidgetIds) {
super.onDeleted(context, appWidgetIds);
}
@Override
public void onDisabled(Context context) {
super.onDisabled(context);
}
@Override
public void onEnabled(Context context) {
super.onEnabled(context);
}
@Override
public void onReceive(Context context, Intent intent) {
AppWidgetManager mgr = AppWidgetManager.getInstance(context);
if (intent.getAction().equals(TOAST_ACTION)) {
int appWidgetId = intent.getIntExtra(
AppWidgetManager.EXTRA_APPWIDGET_ID,
AppWidgetManager.INVALID_APPWIDGET_ID);
int viewIndex = intent.getIntExtra(EXTRA_ITEM, 0);
Toast.makeText(context, "Touched view " + viewIndex,
Toast.LENGTH_SHORT).show();
// mgr.updateAppWidget(appWidgetId, views);
}
super.onReceive(context, intent);
}
@SuppressWarnings("deprecation")
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
final int N = appWidgetIds.length;
for (int i = 0; i < N; i++) {
int appWidgetId = appWidgetIds[i];
intent = new Intent(context, MyRemoteViewsService.class);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
views = new RemoteViews(context.getPackageName(),
R.layout.widget_layout);
views.setRemoteAdapter(appWidgetId, R.id.stackWidgetView, intent);
views.setEmptyView(R.id.stackWidgetView, R.id.stackWidgetEmptyView);
Intent templateIntent = new Intent(context,
BriGeWidgetProvider.class);
templateIntent.setAction(BriGeWidgetProvider.TOAST_ACTION);
templateIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,
appWidgetId);
intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME)));
PendingIntent templatePendingIntent = PendingIntent.getBroadcast(
context, 0, templateIntent,
PendingIntent.FLAG_UPDATE_CURRENT);
views.setPendingIntentTemplate(R.id.stackWidgetView,
templatePendingIntent);
appWidgetManager.updateAppWidget(appWidgetId, views);
}
super.onUpdate(context, appWidgetManager, appWidgetIds);
}
}
public class MyRemoteViewsService extends RemoteViewsService {
@Override
public RemoteViewsFactory onGetViewFactory(Intent intent) {
return new BriGeRemoteViewsFactory(this.getApplicationContext(), intent);
}
class BriGeRemoteViewsFactory implements RemoteViewsFactory {
private ArrayList<ItemI> itemList;
private Context context;
private int appWidgetId;
public BriGeRemoteViewsFactory(Context context, Intent intent) {
this.context = context;
this.appWidgetId = intent.getIntExtra(
AppWidgetManager.EXTRA_APPWIDGET_ID,
AppWidgetManager.INVALID_APPWIDGET_ID);
}
@Override
public void onCreate() {
itemList = getData();
}
@Override
public void onDataSetChanged() {
itemList = getData();
}
@Override
public void onDestroy() {
itemList.clear();
}
@Override
public int getCount() {
if (itemList != null)
return itemList.size();
else
return 0;
}
@Override
public RemoteViews getViewAt(int position) {
ItemI item = itemList.get(position);
RemoteViews rv = new RemoteViews(context.getPackageName(),
R.layout.item_view);
rv.setTextViewText(R.id.title, item.getTitle());
rv.setImageViewBitmap(R.id.img, getImageBitmap(item.getImage()));
// rv.setTextViewText(R.id.descr, item.getDescription());
Bundle extras = new Bundle();
extras.putInt(BriGeWidgetProvider.EXTRA_ITEM, position);
Intent fillIntent = new Intent();
fillIntent.putExtras(extras);
rv.setOnClickFillInIntent(R.id.title, fillIntent);
rv.setOnClickFillInIntent(R.id.img, fillIntent);
// rv.setOnClickFillInIntent(R.id.descr, fillIntent);
return rv;
}
private Bitmap getImageBitmap(String url) {
Bitmap bm = null;
try {
URL aURL = new URL(url);
URLConnection conn = aURL.openConnection();
conn.connect();
InputStream is = conn.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);
bm = BitmapFactory.decodeStream(bis);
bis.close();
is.close();
} catch (IOException e) {
}
return bm;
}
@Override
public RemoteViews getLoadingView() {
return null;
}
@Override
public int getViewTypeCount() {
return 1;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public boolean hasStableIds() {
return true;
}
private ArrayList<ItemI> getData() {
JsonParser jp = new JsonParser(context);
return jp.getDataAsList();
}
}
}
我tryed,但我有錯誤,這是一個我logcat的錯誤:了java.lang.RuntimeException:無法啓動MyWidgetProvider:從活動之外呼喚新活動 – user3293990
編輯我的答案與解決方法,這可能並不總是最適合的,但作品 – Sam
完成工作謝謝 – user3293990