Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 谁(以及如何)创建AppWidgetProvider的实例?_Android_Android Widget - Fatal编程技术网

Android 谁(以及如何)创建AppWidgetProvider的实例?

Android 谁(以及如何)创建AppWidgetProvider的实例?,android,android-widget,Android,Android Widget,upd2。这个问题是在执行了一种黑魔法程序(卸载、清理Eclipse项目、重新启动Android设备、重建、安装、运行)之后才出现的。它没有解决,它已经消失了。谁能解释一下发生了什么事 upd。看起来,在我的Android小部件项目中根本没有运行Java代码,它是按照Hello小部件教程(参考注释)建模的。有没有办法运行一些代码使我的小部件变得有用?我相信这是可能的,因为有很多做一些事情的小部件。他们是怎么做到的 在Hello widget教程之后,我为一个简单的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);
        }
    }
}