Android 谁(以及如何)创建AppWidgetProvider的实例?
upd2。这个问题是在执行了一种黑魔法程序(卸载、清理Eclipse项目、重新启动Android设备、重建、安装、运行)之后才出现的。它没有解决,它已经消失了。谁能解释一下发生了什么事 upd。看起来,在我的Android小部件项目中根本没有运行Java代码,它是按照Hello小部件教程(参考注释)建模的。有没有办法运行一些代码使我的小部件变得有用?我相信这是可能的,因为有很多做一些事情的小部件。他们是怎么做到的 在Hello widget教程之后,我为一个简单的Android widget建模: 运行它,我可以看到它根本不工作-文本视图没有改变 下面是一些代码: 舱单:Android 谁(以及如何)创建AppWidgetProvider的实例?,android,android-widget,Android,Android Widget,upd2。这个问题是在执行了一种黑魔法程序(卸载、清理Eclipse项目、重新启动Android设备、重建、安装、运行)之后才出现的。它没有解决,它已经消失了。谁能解释一下发生了什么事 upd。看起来,在我的Android小部件项目中根本没有运行Java代码,它是按照Hello小部件教程(参考注释)建模的。有没有办法运行一些代码使我的小部件变得有用?我相信这是可能的,因为有很多做一些事情的小部件。他们是怎么做到的 在Hello widget教程之后,我为一个简单的Android widget建模
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.pell.hellowidget"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<receiver android:name="HelloWidgetProvider" android:label="@string/app_name">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data android:name="android.appwidget.provider"
android:resource="@xml/hello_widget_provider" />
</receiver>
</application>
</manifest>
据我所知,由于没有人实例化com.pell.hellowidget.HelloWidgetProvider对象,所以它无法工作。入口点(intmain(intargc,char*argv[])、WinMain等)的Java/Android小部件/etc模拟是什么?谁(以及如何)实例化AppWidgetProvider对象?根据您最后的评论。在
android:name
中,有时是必不可少的。通常,我总是在清单中使用完全限定名(“com.super.cool.thing.MySpecialClassActivity”),因为它非常清楚
AppWidget的“入口点”是提供者类。但是,它仅在被调用时才被实例化,一旦onUpdate
(或onDestroy
)返回,该类就消失了。虽然(我认为)你可以做你已经做过的事情,但这并不是一个好的做法——通常你应该创建一个定义的独立线程来管理你的小部件,或者是一个服务
,一个异步任务
,一个线程
等等
通常,
onUpdate
方法将创建一个意图,用于启动一个服务类,该服务类将控制小部件。这方面的一个例子具体见第8节。在那个教程中,我只想提出一点:一般建议不要使用updatePeriod。我还把使用服务和其他东西的一些考虑因素放在一起。我刚刚改变了另一个实验:删除扩展AppWidgetProvider
和所有@Override
和super.onBlah blah blah
声明。项目的编译、安装和运行与以前一样。这是否意味着没有人关心我的Java代码?在没有Java代码可以运行的情况下,我如何使用我的小部件做一些有用的事情呢?upd。将小部件添加到主屏幕时,我会收到一条消息Unabel以启动com.pell.hellowidget/10147用于广播目的{act=android.appwidget.action.appwidget\u UPDATE flg=0x10 cmp=com.pell.hellowidget/.hellowidget(有额外功能)}:进程不好
。最后通过卸载小部件,在行中添加点来修复它,重新启动我的Android设备,在Eclipse中清理项目,在Eclipse中重建项目,然后再次安装小部件。那是什么?这是一种黑魔法还是什么?嗨,佩尔,我下面的回答有用吗?我怎样才能改进它?我误解你的问题了吗?再次感谢。非常感谢。
<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="280dp"
android:minHeight="180dp"
android:updatePeriodMillis="10000"
android:initialLayout="@layout/hello_widget_layout"
android:resizeMode="vertical" />
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_vertical|center_horizontal"
android:orientation="vertical" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Large Text"
android:textAppearance="?android:attr/textAppearanceLarge" />
</LinearLayout>
package com.pell.hellowidget;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.Timer;
import java.util.TimerTask;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.widget.RemoteViews;
public class HelloWidgetProvider extends AppWidgetProvider {
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
Timer timer = new Timer();
timer.scheduleAtFixedRate(new MyTime(context, appWidgetManager), 1,
1000);
super.onUpdate(context, appWidgetManager, appWidgetIds);
}
private Date currentTime;
private class MyTime extends TimerTask {
RemoteViews remoteViews;
AppWidgetManager appWidgetManager;
ComponentName thisWidget;
DateFormat format = SimpleDateFormat.getTimeInstance(
SimpleDateFormat.MEDIUM, Locale.getDefault());
public MyTime(Context context, AppWidgetManager appWidgetManager) {
this.appWidgetManager = appWidgetManager;
remoteViews = new RemoteViews(context.getPackageName(),
R.layout.hello_widget_layout);
thisWidget = new ComponentName(context, HelloWidgetProvider.class);
}
@Override
public void run() {
currentTime = new Date();
remoteViews.setTextViewText(R.id.textView1,
format.format(currentTime));
appWidgetManager.updateAppWidget(thisWidget, remoteViews);
}
}
}