2011-10-06 4 views
2

로드 블록을 실행했습니다. 나는 일련의 강제 폐쇄를 겪고있다. 에뮬레이터에서 프로그램을 실행할 때 위젯을 설치하기 전에 설치가 강제 종료됩니다.위젯 응용 프로그램 강제 설치시 닫습니다.

기본적으로 버튼이있는 위젯을 만들려고했습니다. 버튼은 위젯을 새로운 레이아웃 (메뉴)으로 변경하기 위해 서비스를 시작한다고 가정합니다. 구성 활동도 있습니다.

추가 정보가 필요한지 알려주세요. 나는 android dev 페이지와 Lars Vogels 튜토리얼을 참고로 사용했다. http://www.vogella.de/articles/AndroidWidgets/article.html

감사합니다. RIP SJ. 나는 결코 매킨토시가 아니었지만 당신의 업적을 높이 평가했습니다.

제공자 :

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> 

로그 캣 :

,536,
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 { 

가 이것을 확인 잘못된

그래서 당신은이 라인에 컨텍스트를 변경해야 public class. 공개되지 않기 때문에 OS는 서비스를 시작하려고 할 때이를 사용할 수 없습니다.

+0

감사합니다. 귀중한 정보입니다. 언급 한 내용을 변경했지만 오류는 동일하게 유지됩니다. – evt

+0

두 번째 오류가 발생했습니다. 지금 내 응답 업데이트 중. 나는 이것이 이것이라고 생각한다. 그 다른 것들은 여전히 ​​잘못입니다. –

+0

그 변화는 확실히 차이를 만들었습니다. 새로운 오류로 LogCat을 업데이트했습니다. 23 번 라인에 널 포인터를 보여줍니다.이 라인은 if (appWidgetIds.length> 0) {' – evt

관련 문제