2011-10-06 52 views
2

我碰到了路障。我正在遇到一系列的力量關閉。當我在模擬器中運行我的程序時,它在強制安裝時會關閉,然後放置該小部件。小部件應用程序關閉安裝

本質上我試圖讓一個有一個按鈕的小部件。該按鈕假設開始一項服務以將小部件更改爲新的佈局(菜單)。 還有一個配置活動。

讓我知道是否需要添加更多信息。我一直在使用Android開發頁面,並使用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 [email protected] 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. 
+0

要獲得幫助,您需要發佈錯誤日誌。 –

+0

我發佈了LogCat中出現的內容。這是你想要的?如果不是,你可以更具體一些,這樣我可以做更多的閱讀。 謝謝 – evt

回答

1

在您的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 { 

將此一公共課。由於它不公開,操作系統在嘗試啓動服務時無法使用它。

+0

謝謝,這是有價值的信息。 我已經提出了您提到的更改,但錯誤仍然相同。 – evt

+0

剛剛發現了第二個錯誤。現在更新我的回覆。我覺得這就是。但其他東西仍然是錯誤的。 –

+0

這種改變絕對有所作爲。我用新的錯誤更新了LogCat。它顯示了第23行的空指針,它是這行'if(appWidgetIds.length> 0){' – evt