【发布时间】:2013-03-27 17:30:18
【问题描述】:
更新2。问题出现在某种黑魔法例程(卸载、清理 Eclipse 项目、重新启动 Android 设备、重建、安装、运行)之后。它没有解决,它已经消失了。谁能解释一下发生了什么?
更新。似乎,在我的 Android 小部件项目中根本没有运行任何 Java 代码,它以 Hello Widget 教程(参考 cmets)为模型。有什么方法可以运行一些代码来使我的小部件有用吗?我相信这是可能的,因为有很多做某事的小部件。他们是怎么做到的?
我根据 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/layout/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/pell/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 对象,因此它不起作用。入口点(int main(int argc, char * argv[])、WinMain 等)的 Java/Android Widget/etc 模拟是什么?谁(以及如何)实例化 AppWidgetProvider 对象?
【问题讨论】:
-
我刚刚将
<receiver android:name="HelloWidgetProvider"...行更改为<receiver android:name=".HelloWidgetFoo" android:label="@string/app_name">。没有 HelloWidgetFoo 类定义。但是项目编译正常,.apk 安装正常,小部件可以添加到主屏幕。这是什么意思? -
另一个实验:删除
extends AppWidgetProvider和所有@Override和super.onBlah-blah-blah声明。项目像以前一样编译、安装和运行。这是否意味着没有人关心我的 Java 代码?在无法运行 Java 代码的情况下,我怎么能用我的小部件做一些有用的事情? -
更新。将小部件添加到主屏幕我收到一条消息
Unabel to launch com.pell.hellowidget/10147 for broadcast Intent { act=android.appwidget.action.APPWIDGET_UPDATE flg=0x10 cmp=com.pell.hellowidget/.HelloWidget (has extras) }: process is bad。 -
最后通过卸载小部件,在
<receiver android:name=".HelloWidgetProvider" android:label="@string/app_name">行添加点,重新启动我的 Android 设备,在 Eclipse 中清理项目,在 Eclipse 中重建项目并再次安装小部件来修复它。这是什么?这是一种黑魔法还是什么? -
您好,我在下面的回答有帮助吗?我该如何改进它?我误解你的问题了吗?