2013-05-08 2 views
0

내 앱에 대시 확장을하려고합니다. 기본적으로 내 응용 프로그램의 주요 활동 센서에서 데이터를 읽고 그것을 보여줍니다. 이제 DashClock은 Service를 확장하는 DashClockExntension을 확장합니다. 의심의 여지가,이 서비스를 어떻게해야 응용 프로그램의 메인 클래스에서 데이터를 요청해야합니다. startService()와 함께 인 텐트를 사용하는 경우 위젯에 null 값이 나타납니다. 위젯이 표시하기 전에 데이터를 가져 오는 방법.활동에서 주기적으로 데이터를 가져 오는 방법은 무엇입니까?

package com.thePaze.Ambiance; 

import android.content.Intent; 
import com.google.android.apps.dashclock.api.DashClockExtension; 
import com.google.android.apps.dashclock.api.ExtensionData; 

public class DashMain extends DashClockExtension { 

    String temp, humidity; 

    @Override 
    protected void onUpdateData(int reason) { 
     // TODO Auto-generated method stub 



     publishUpdate(new ExtensionData().visible(true).status("Ambient").icon(R.drawable.ic_launcher).expandedTitle("Temp & Humidity").expandedBody("Temperature: " + temp+ "\nHumidity: " +humidity) 
       .clickIntent(new Intent(DashMain.this, SensorMain.class)) 

     ); 

    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     // TODO Auto-generated method stub 
     super.onStartCommand(intent, flags, startId); 

     temp = intent.getStringExtra(temp); 
     humidity = intent.getStringExtra(humidity); 


     return START_STICKY; 

    } 

} 

답변

2

From the documentation:

onUpdateData (INT)은 기본적으로 시간 당 대략 한 번만 호출되지만, 확장은 더 자주 업데이트를 요청하는 등 setUpdateWhenScreenOn (부울)와 같은 방법과 addWatchContentUris(String[])를 사용할 수 있습니다. 해당 링크를 클릭하면

것은, 당신은 addWatchContentUris이 문서 (문자열 [])

요청 주요 DashClock의 앱이 주어진 컨텐츠 URI를 (ContentResolver.registerContentObserver 사용)보고보고 있습니다 변경 사항이 발생하면 확장 프로그램의 onUpdateData (int) 메서드를 호출하십시오. 이 은 일반적으로 onInitialize (boolean) 메소드에서 호출되어야합니다.

콘텐츠 제공 업체에 익숙합니까? 활동간에 데이터를 공유하는 방법입니다. 콘텐츠 제공 업체를 시청하는 활동은 업데이트 알림을받습니다. 이것은 대시 클럭 업데이트의 빈도를 증가시키는 것을 알고있는 유일한 방법입니다.


편집 : 추가 더 구체적인

은 당신의 AndroidManifest.xml에 콘텐츠 제공 항목을 추가합니다. 권위는 패키지 이름으로 시작해야하지만, 실제로는 임의의 식별자입니다.

<provider android:authorities="com.mypackage.myapp.myprovider" 
    android:name=".MyProviderClassName" 
    android:exported="true"/> 

이제 ContentProvider를 확장하는 MyProviderClassName이라는 클래스를 만듭니다. 당신은 어떤 메소드도 구현할 필요가 없으며 단지 디폴트 값을 반환한다.

class MyProviderClassName extends ContentProvider { 
    @Override 
    public boolean onCreate() { 
     return true; 
    } 

    @Override 
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { 
     return null; 
    } 

    @Override 
    public String getType(Uri uri) { 
     return null; 
    } 

    @Override 
    public Uri insert(Uri uri, ContentValues values) { 
     return null; 
    } 

    @Override 
    public int delete(Uri uri, String selection, String[] selectionArgs) { 
     return 0; 
    } 

    @Override 
    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { 
     return 0; 
    } 
} 

이제 onInitialize (당신의 확장 클래스)에 다음을 추가

: 당신이 확장 활동 내에서 업데이트 할 때마다

addWatchContentUris(new String[] { "content://" + YOUR_AUTHORITY_FROM_MANIFEST } 

, 단순히 다음과 같은 메서드를 호출

getContentResolver().notifyChange(Uri.parse("content://" + YOUR_AUTHORITY_FROM_MANIFEST), null); 
관련 문제