2013-04-11 2 views
0

유료 버전을 간단한 라이센스 서버로 사용하여 무료/유료 앱을 관리하려고합니다. 나는들의 OnDestroy 처리를 시도했습니다 두 가지 방법은()가 있습니다LVL 유료 앱의 BroadcastReceiver/IntentService

public class LicenseService extends IntentService 
{ 
    private static final String TAG = LicenseService.class.getSimpleName(); 

    private LicenseCheckerCallback mLicenseCheckerCallback; 
    private LicenseChecker mChecker; 

    ... 

    public LicenseService() 
    { 
     super(TAG); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) 
    { 
     // Try to use more data here. ANDROID_ID is a single point of attack. 
     String deviceId = ...; 

     // Library calls this when it's done. 
     mLicenseCheckerCallback = new MyLicenseCheckerCallback(); 
     // Construct the LicenseChecker with a policy. 
     mChecker = new LicenseChecker(this, new ServerManagedPolicy(this, new AESObfuscator(SALT, getPackageName(), deviceId)), 
       BASE64_PUBLIC_KEY); 
     mChecker.checkAccess(mLicenseCheckerCallback); 
    } 

    private class MyLicenseCheckerCallback implements LicenseCheckerCallback 
    { 
     public void allow(int policyReason) 
     { 
      Log.i(TAG, "License Accepted"); 
      Intent i = new Intent(); 
      i.setAction(App.LICENSE_RECEIVER); 
      i.putExtra(App.LICENSE_RESULT, App.LICENSE_ALLOW); 
      sendBroadcast(i); 
//   mChecker.onDestroy(); 
     } 

     public void dontAllow(int policyReason) 
     { 
      Log.e(TAG, "License Denied"); 
      Intent i = new Intent(); 
      i.setAction(App.LICENSE_RECEIVER); 
      i.putExtra(App.LICENSE_RESULT, App.LICENSE_DISALLOW); 
      sendBroadcast(i); 
//   mChecker.onDestroy(); 
     } 

     public void applicationError(int errorCode) 
     { 
      Log.i(TAG, "LR Error"); 
      Intent i = new Intent(); 
      i.setAction(App.LICENSE_RECEIVER); 
      i.putExtra(App.LICENSE_RESULT, App.LICENSE_ERROR); 
      sendBroadcast(i); 
//   mChecker.onDestroy(); 
     } 
    } 

// @Override 
// public void onDestroy() { 
//  super.onDestroy(); 
//  mChecker.onDestroy(); 
// } 
} 

: IntentService를 호출

public class LicenseRequest extends BroadcastReceiver 
{ 
    private static final String TAG = LicenseRequest.class.getSimpleName(); 

    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     if (!intent.getAction().equals(App.LICENSE_REQUEST)) 
     { 
      return; 
     } 
     Intent licenseRequest = new Intent(context, LicenseService.class); 
     context.startService(licenseRequest); 
    } 
} 

:

유료 응용 프로그램은 수신기가 있습니다. 내가)합니다 (LicenseService.onDestroy 내에서 호출하면 내가 얻을 : 이것은 내가 믿는 콜백 전에 종료 IntentService의 수명주기 때문이다

04-11 15:35:13.604: W/MessageQueue(30689): Handler (android.os.Handler) {41388638} sending message to a Handler on a dead thread 
04-11 15:35:13.604: W/MessageQueue(30689): java.lang.RuntimeException: Handler (android.os.Handler) {41388638} sending message to a Handler on a dead thread 

.

내가 콜백 내에서 호출하는 경우 :

04-11 15:49:52.554: E/ActivityThread(32595): Service app.LicenseService has leaked ServiceConnection [email protected] that was originally bound here 

이해가 안이 하나. 나는 이것이 유료 버전을 관리하는 꽤 일반적인 방법이라고 생각합니다. 사람들이 여기에서 라이프 사이클을 어떻게 관리 했습니까? 감사!

답변

0

대답은 ContentProvider를 사용하고 쿼리에서 간단한 MatrixCursor를 제공하는 것입니다. BroadcastReceivers는 사용자가 먼저 명시 적으로 실행해야한다는 요구 사항으로 인해 불가능합니다. 시작되지 않는 앱에서는 불가능합니다. ContentProvider는 좀 이상하지만 단순합니다.