Android appwidget开始新的活动
我创建了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();
}
}
}
编辑:
使用context.startActivity(new Intent(context, ActivityClassName.class).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
您应该单击挂起的意图设置到远程视图。
见这 - http://developer.android.com/reference/android/widget/RemoteViews.html#setOnClickPendingIntent
是的我知道我用意图调用Opdate方法MyRemoteViewsService类,但现在我想打电话在小部件点击活动例如Mainactivity.java类 – user3293990
我没有看到在你的代码中,你设置点击pendin g意图在您的远程视图上。每次用户点击您的小部件时,这个挂起的意图都会被触发。 – ranjk89
你有看过这个 - http://developer.android.com/reference/android/widget/StackView.html#onTouchEvent(android.view.MotionEvent) – ranjk89
按下按钮:
Intent newIntent = new Intent("PACKAGENAME.CLASSNAME");
newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(newIntent);
或者:
newIntent.setComponent(new ComponentName("PACKAGENAME", "PACKAGENAME.CLASSNAME"));
newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(newIntent);
使用PendinIndent去从MyWidgetProvider到MyRemoteViewsService.class 。
做到这一点在“的onUpdate”方法 -
Intent intent = new Intent(context,MyRemoteViewsService.class);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
RemoteViews remoteViews = remoteViews.setOnClickPendingIntent(R.id.button , pendingIntent);
appWidgetManager.updateAppWidget(appWidgetIds, remoteViews);
我tryed,但我有错误,这是一个我logcat的错误:了java.lang.RuntimeException:无法启动MyWidgetProvider:从活动之外呼唤新活动 – user3293990
编辑我的答案与解决方法,这可能并不总是最适合的,但作品 – Sam
完成工作谢谢 – user3293990