UPD2。在一种黑魔法例程(卸载,清理Eclipse项目,重启Android设备,重建,安装,运行)之后问题已经消失。它没有解决,它已经消失了。有人可以解释一下发生了什么吗?
UPD。似乎,我的Android小部件项目中没有运行任何Java代码,模仿Hello Widget教程(参考评论)。有没有办法运行一些代码来使我的小部件有用?我相信它是可能的,因为有很多做什么小工具。他们是如何做到的?
我在Hello Widget教程之后建模了一个简单的Android小部件:http://nm-blog.sanid.com/2009/07/android-hellowidget-tutorial/
运行它我可以看到它根本不起作用 - 文本视图没有改变。
以下是一些代码:
清单:
<?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>
RES / XML / hello_widget_provider.xml
<?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" />
RES /布局/ hello_widget_layout.xml
<?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>
的src / COM /佩尔/ HelloWidget的/ HelloWidgetProvider.java:
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);
}
}
}
据我所知,由于没有人实例化com.pell.hellowidget.HelloWidgetProvider对象,因此无法正常工作。什么是入口点的Java / Android Widget / etc模拟(int main(int argc,char * argv []),WinMain等)?谁(以及如何)实例化AppWidgetProvider对象?
答案 0 :(得分:0)
根据你的最终评论,。在android:name
中有时可能是必不可少的。通常,我总是在清单中使用完全限定名称(“com.super.cool.thing.MySpecialClassActivity”),因为它非常清楚。
AppWidget的“入口点”是提供者类。但是,它仅在被调用时被实例化,并且一旦onUpdate
(或onDestroy
)返回,该类就会消失。虽然(我认为)你可以做你已经完成的事情,但这不是一个好习惯 - 通常你应该创建一个定义的单独线程来管理你的小部件,Service
,{{1 },AsyncTask
等。
通常,Thread
方法将创建一个旨在启动将控制窗口小部件的Service类的intent。这方面的一个例子是http://www.vogella.com/articles/AndroidWidgets/article.html,特别是第8节。我只会在该教程中提出一点意见:通常建议不要使用updatePeriod。我还在Service being re-Created by AlarmManager中对服务和其他内容的使用进行了一些考虑。