بررسی بهروزبودن برنامه
در ادامه با نحوهی بررسی بهروزبودن برنامه (توسط به دست آوردن versionCode آخرین نسخهی موجود از برنامهی خود در کافهبازار) آشنا خواهید شد.
در پوشهٔ aidl ماژول برنامهتان پکیجی با اسم com.farsitel.bazaar در پروژهٔ خود ایجاد کنید و فایلIUpdateCheckService .<wbr/>aidl را در آن کپی کنید. پس از انجام این کار ساختار پوشهبندی پروژهٔ شما در محیط Android Studio باید شبیه تصویر زیر باشد:
حال باید پروژه خود را build و compile کنید (میتوانید gradle task مربوط به ساختن فایلهای مورد نیاز (که نام آن به شکل compileDebugAidl یا چیزی مشابه است) را اجرا کنید).
فرض کنید میخواهید versionCode برنامهٔ خود را داخل Activityای به نام UpdateCheckActivity از برنامهٔ بازار بپرسید. برای ایجاد ارتباط بین سرویس بازار و برنامهٔ خود، یک کلاس درونی به نام UpdateServiceConnection را که کلاس ServiceConnection اندروید را پیادهسازی میکند ایجاد کنید. UpdateServiceConnection شامل متدهای onServiceConnected و onServiceDiconnected خواهد بود. این متدها callbackهایی هستند که پیادهسازی Stub سرویس بازار را هنگام اتصال میگیرند. در اینجا نیاز دارید که نوع آن را از Stub به پیادهسازی سرویس Aidl تغییر دهید (Type cast). کد زیر در متد onServiceConnected:
IUpdateCheckService.Stub.asInterface((IBinder) boundService);
این کد اشارهگر سرویسی برای دسترسی به دادهها و متدها را در اختیار شما قرار خواهد داد.
کد کامل مربوط به UpdateCheckActivity در زیر آمده است:
public class MainActivity extends Activity {
IUpdateCheckService service;
UpdateServiceConnection connection;
private static final String TAG = "UpdateCheck";
class UpdateServiceConnection implements ServiceConnection {
public void onServiceConnected(ComponentName name, IBinder boundService) {
service = IUpdateCheckService.Stub
.asInterface((IBinder) boundService);
try {
long vCode = service.getVersionCode("packagename");
Toast.makeText(MainActivity.this, "Version Code:" + vCode,
Toast.LENGTH_LONG).show();
} catch (Exception e) {
e.printStackTrace();
}
Log.d(TAG, "onServiceConnected(): Connected");
}
public void onServiceDisconnected(ComponentName name) {
service = null;
Log.d(TAG, "onServiceDisconnected(): Disconnected");
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initService();
...
}
private void initService() {
Log.i(TAG, "initService()");
connection = new UpdateServiceConnection();
Intent i = new Intent(
"com.farsitel.bazaar.service.UpdateCheckService.BIND");
i.setPackage("com.farsitel.bazaar");
boolean ret = bindService(i, connection, Context.BIND_AUTO_CREATE);
Log.d(TAG, "initService() bound value: " + ret);
}
/** This is our function to un-binds this activity from our service. */
private void releaseService() {
unbindService(connection);
connection = null;
Log.d(TAG, "releaseService(): unbound.");
}
@Override
protected void onDestroy() {
super.onDestroy();
releaseService();
}
}
کلاس داخلی زیر، درخواست شما به بازار را پردازش میکند و جواب را به وسیلهٔ یک toast نشان میدهد.
class UpdateServiceConnection implements ServiceConnection {
public void onServiceConnected(ComponentName name, IBinder boundService) {
service = IUpdateCheckService.Stub
.asInterface((IBinder) boundService);
try {
long vCode = service.getVersionCode("packagename");
Toast.makeText(MainActivity.this, "Version Code:" + vCode,
Toast.LENGTH_LONG).show();
} catch (Exception e) {
e.printStackTrace();
}
Log.d(TAG, "onServiceConnected(): Connected");
}
public void onServiceDisconnected(ComponentName name) {
service = null;
Log.d(TAG, "onServiceDisconnected(): Disconnected");
}
}
شما باید این سرویس را با استفاده از ()initService زمانی که میخواهید وضعیت بروز بودن برنامه را بررسی کنید، راهاندازی اولیه کنید (مثلا در این مثال، ما این تابع را در onCreate مربوط به MainActivity صدا زدیم).
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initService();
...
}
تابع initService یک UpdateServiceConnection جدید و یک Intent جدید میسازد و این دو را به هم متصل میکند تا به بازار متصل شوند.
private void initService() {
Log.i(TAG, "initService()");
connection = new UpdateServiceConnection();
Intent i = new Intent(
"com.farsitel.bazaar.service.UpdateCheckService.BIND");
i.setPackage("com.farsitel.bazaar");
boolean ret = bindService(i, connection, Context.BIND_AUTO_CREATE);
Log.d(TAG, "initService() bound value: " + ret);
}
تابع releaseService به منظور آزاد سازی منابع دستگاه کاربر، آن منابع را آزاد میکند.
private void releaseService() {
unbindService(connection);
connection = null;
Log.d(TAG, "releaseService(): unbound.");
}
وقتی که کارتان با این سرویس تمام شد باید تابع ()releaseService را صدا بزنید (در این مثال، ما آن را در تابع onDestroy مربوط به MainActivity صدا زدیم).
protected void onDestroy() {
super.onDestroy();
releaseService();
...
}
خط زیر در کد بالا versionCode برنامه شما را در صورتی که بهروزرسانی برای آن وجود داشته باشد (versionCode برنامه موجود در بازار از versionCode برنامهای که بر روی گوشی کاربر نصب است، بزرگتر باشد)، برمیگرداند و در غیر این صورت مقدار ۱- را بر میگرداند. توجه کنید که باید "your.app.packagename" را با نام بستهٔ برنامهٔ خود جایگزین کنید.
long vCode = service.getVersionCode("packagename");
بسته به این که کاربر از چه نسخهای استفاده میکند و نسخه موجود در بازار چیست میتوانید تصمیمهای متفاوتی بگیرید. برای مثال میتوانید به کاربر پیغام بهروزرسانی بدهید و در صورت توافق، وی را به صفحه برنامهتان در کافهبازار ارجاع دهید تا بتواند آخرین نسخه برنامهتان را بگیرد. البته توجه کنید که بررسی بهروزبودن برنامههای نصب شده، هر چند وقت یکبار انجام میشود و این API با cache سمت بازار پاسخ داده میشود.
متد initService در کد بالا متدی است که اتصال با بازار را برقرار میکند و از متد onCreate مربوط به UpdateCheckActivity فراخوانی میشود.