Приложение-виджет ForceCloses по установке - PullRequest
2 голосов
/ 06 октября 2011

Я столкнулся с дорожным блоком.Я сталкиваюсь с серией принудительных закрытий.Когда я запускаю свою программу в эмуляторе, она принудительно закрывается при установке, прежде чем я помещаю виджет.

По сути, я пытался создать виджет, который имеет кнопку.Предполагается, что кнопка запускает сервис для изменения виджета на новый макет (меню).Также есть операция по настройке.

Дайте мне знать, если мне нужно добавить дополнительную информацию.Я использую страницы Android and Dev и учебник Lars Vogels в качестве ссылки.http://www.vogella.de/articles/AndroidWidgets/article.html

Спасибо, RIP SJ.Я никогда не был mac-ie, но я оценил вашу работу.

Провайдер:

public class CodeSummitWidgetProvider extends AppWidgetProvider{

public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {

    Intent intent = new Intent(context.getApplicationContext(), TestService.class);
    PendingIntent pendingIntent = PendingIntent.getService(context.getApplicationContext(), 0, intent, 0);
    RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.codesummit_widget_provider_layout);
    views.setOnClickPendingIntent(R.id.tomenu, pendingIntent);
    appWidgetManager.updateAppWidget(appWidgetIds, views);
    context.startService(intent);

}
}

Служба:

public class TestService extends Service {

@Override
public void onStart(Intent intent, int startId) {


    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(this.getApplicationContext());

    int[] appWidgetIds = intent.getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS);

    if (appWidgetIds.length > 0) {
        for(int widgetId : appWidgetIds) {
            RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.codesummit_widget_menu_layout);
            appWidgetManager.updateAppWidget(widgetId, remoteViews);
        }
        stopSelf();
    }

    super.onStart(intent, startId);
}

Манифест:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="com.main.codesummit"
  android:versionCode="1"
  android:versionName="1.0">
<uses-sdk android:minSdkVersion="8" />

<application android:icon="@drawable/icon" android:label="@string/app_name">
    <receiver android:name="CodeSummitWidgetProvider">
        <intent-filter>
            <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
        </intent-filter>
        <meta-data  android:name="android.appwidget.provider"
                    android:resource="@xml/codesummit_appwidget_info" />
    </receiver>
    <activity android:name=".CodeSummitWidgetConfigure">
        <intent-filter>
            <action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" />
        </intent-filter>
    </activity>
    <service android:name=".TestService" />

</application>

LogCat:

10-06 23:59:04.925: INFO/ActivityManager(65): Start proc com.main.codesummit for broadcast com.main.codesummit/.CodeSummitWidgetProvider: pid=312 uid=10036 gids={}
10-06 23:59:05.596: DEBUG/AndroidRuntime(312): Shutting down VM
10-06 23:59:05.606: WARN/dalvikvm(312): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
10-06 23:59:05.665: ERROR/AndroidRuntime(312): FATAL EXCEPTION: main
10-06 23:59:05.665: ERROR/AndroidRuntime(312): java.lang.RuntimeException: Unable to start service com.main.codesummit.TestService@44ee5a38 with Intent { cmp=com.main.codesummit/.TestService }: java.lang.NullPointerException
10-06 23:59:05.665: ERROR/AndroidRuntime(312):     at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3063)
10-06 23:59:05.665: ERROR/AndroidRuntime(312):     at android.app.ActivityThread.access$3600(ActivityThread.java:125)
10-06 23:59:05.665: ERROR/AndroidRuntime(312):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2096)
10-06 23:59:05.665: ERROR/AndroidRuntime(312):     at android.os.Handler.dispatchMessage(Handler.java:99)
10-06 23:59:05.665: ERROR/AndroidRuntime(312):     at android.os.Looper.loop(Looper.java:123)
10-06 23:59:05.665: ERROR/AndroidRuntime(312):     at android.app.ActivityThread.main(ActivityThread.java:4627)
10-06 23:59:05.665: ERROR/AndroidRuntime(312):     at java.lang.reflect.Method.invokeNative(Native Method)
10-06 23:59:05.665: ERROR/AndroidRuntime(312):     at java.lang.reflect.Method.invoke(Method.java:521)
10-06 23:59:05.665: ERROR/AndroidRuntime(312):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
10-06 23:59:05.665: ERROR/AndroidRuntime(312):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
10-06 23:59:05.665: ERROR/AndroidRuntime(312):     at dalvik.system.NativeStart.main(Native Method)
10-06 23:59:05.665: ERROR/AndroidRuntime(312): Caused by: java.lang.NullPointerException
10-06 23:59:05.665: ERROR/AndroidRuntime(312):     at com.main.codesummit.TestService.onStart(TestService.java:23)
10-06 23:59:05.665: ERROR/AndroidRuntime(312):     at android.app.Service.onStartCommand(Service.java:420)
10-06 23:59:05.665: ERROR/AndroidRuntime(312):     at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3053)
10-06 23:59:05.665: ERROR/AndroidRuntime(312):     ... 10 more
10-06 23:59:10.696: INFO/Process(312): Sending signal. PID: 312 SIG: 9
10-06 23:59:10.795: INFO/ActivityManager(65): Process com.main.codesummit (pid 312) has died.

1 Ответ

1 голос
/ 06 октября 2011

В вашем методе onUpdate вы используете неправильный контекст в нескольких местах. Контекст, передаваемый в onUpdate, действует только до тех пор, пока не завершится выполнение функции onUpdate. Таким образом, вы не можете использовать его для чего-то, что хотите прожить дольше, чем эта функция, например, для вашей службы. Контекст приложения живет для жизни приложения. Чтобы получить его из onUpdate, вызовите context.getApplicationContext ().

Итак, вам нужно изменить контекст в следующих строках:

Intent intent = new Intent(context, TestService.class);
PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, 0);

Кому:

Intent intent = new Intent(context.getApplicationContext(), TestService.class);
PendingIntent pendingIntent = PendingIntent.getService(context.getApplicationContext(), 0, intent, 0);

Также неверный уровень доступа для класса

class TestService extends Service {

Сделайте это публичным уроком. Поскольку она не является общедоступной, ОС не может использовать ее при попытке запустить службу.

...