بررسی وضعیت لاگین کاربر

 

توجه: این سرویس از نسخه ۶.۵ به بعد بازار در دسترس است.

نحوهٔ بررسی وضعیت لاگین کاربر در ادامه آورده شده است. با استفاده از این امکان بازار می‌توانید بفهمید که کاربر وارد حساب کاربری‌اش در بازار شده است یا خیر.

برای شروع، پکیجی با نام com.farsitel.bazaar در پروژهٔ خود ایجاد کنید و فایل ILoginCheckService.aidl را در آن کپی کنید. پس از این کار ساختار پروژهٔ شما در Android Studio به این شکل باید باشد:

Android Studio Screenshot

فرض کنید می‌خواهید وضعیت لاگین کاربر را داخل Activityای به نام LoginCheckActivity از بازار بپرسید. برای ایجاد ارتباط بین سرویس بازار و برنامهٔ خود، یک کلاس درونی به نام LoginCheckServiceConnection که کلاس ServiceConnection اندروید را پیاده‌سازی می‌کند را ایجاد کنید. LoginCheckServiceConnection شامل متدهای onServiceConnected و onServiceDiconnected خواهد بود. این متدها callbackهایی هستند که پیاده‌سازی Stub سرویس بازار را هنگام اتصال می‌گیرند. در این‌جا نیاز دارید که نوع آن را از Stub به پیاده‌سازی سرویس Aidl تغییر دهید (Type cast). کد زیر در متد onServiceConnected:

ILoginCheckService.Stub.asInterface((IBinder) boundService);

 این کد اشاره‌گر سرویسی برای دسترسی به داده‌ها و متدها را در اختیار شما قرار خواهد داد. 

کد کامل مربوط به  LoginCheckActivity در زیر آمده است:

public class LoginCheckActivity extends Activity {

    ILoginCheckService service;

    LoginCheckServiceConnection connection;

    private static final String TAG = "LoginCheck";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initService();
    }

    private void initService() {
        Log.i(TAG, "initService()");
        connection = new LoginCheckServiceConnection();
        Intent i = new Intent(
                "com.farsitel.bazaar.service.LoginCheckService.BIND");
        i.setPackage("com.farsitel.bazaar");
        boolean ret = bindService(i, connection, Context.BIND_AUTO_CREATE);
        Log.e(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();
    }

    public class LoginCheckServiceConnection implements ServiceConnection {

        private static final String TAG = "LoginCheck";

        public void onServiceConnected(ComponentName name, IBinder boundService) {
            service = ILoginCheckService.Stub
                    .asInterface((IBinder) boundService);
            try {
                boolean isLoggedIn = service.isLoggedIn();
                Toast.makeText(MainActivity.this, "isLoggedIn:" + isLoggedIn,
                        Toast.LENGTH_LONG).show();
            } catch (Exception e) {
                e.printStackTrace();
            }
            Log.e(TAG, "onServiceConnected(): Connected");
        }

        public void onServiceDisconnected(ComponentName name) {
            service = null;
            Log.e(TAG, "onServiceDisconnected(): Disconnected");
        }
    }
}

کلاس داخلی زیر، درخواست شما به بازار را پردازش می‌کند و جواب را به وسیله‌ی یک toast نشان می‌دهد.

public class LoginCheckServiceConnection implements ServiceConnection {
    private static final String TAG = "LoginCheck";
    public void onServiceConnected(ComponentName name, IBinder boundService) {
        service = ILoginCheckService.Stub
                    .asInterface((IBinder) boundService);
        try {
            boolean isLoggedIn = service.isLoggedIn();
            Toast.makeText(MainActivity.this, "isLoggedIn:" + isLoggedIn,
                    Toast.LENGTH_LONG).show();
        } catch (Exception e) {
            e.printStackTrace();
        }
        Log.e(TAG, "onServiceConnected(): Connected");
    }

    public void onServiceDisconnected(ComponentName name) {
        service = null;
        Log.e(TAG, "onServiceDisconnected(): Disconnected");
    }
}

شما باید این سرویس را با استفاده از  ()initService زمانی که می‌خواهید وضعیت لاگین کاربر را بررسی کنید، راه‌اندازی اولیه کنید (مثلا در این مثال، ما این تابع را در onCreate مربوط به MainActivity صدا زدیم)

protected void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	initService();
	...
}

تابع initService یک LoginCheckServiceConnection جدید و یک Intent جدید می‌سازد و این دو را به هم متصل می‌کند تا به بازار متصل شوند.

private void initService() {
    Log.i(TAG, "initService()");
    connection = new LoginCheckServiceConnection();
    Intent i = new Intent("com.farsitel.bazaar.service.LoginCheckService.BIND");
    i.setPackage("com.farsitel.bazaar");
    boolean ret = bindService(i, connection, Context.BIND_AUTO_CREATE);
    Log.e(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();
	...
}

خط زیر در کد بالا:

boolean isLoggedIn = service.isLoggedIn();

وضعیت لاگین بودن کاربر را به صورت boolean برمی‌گرداند. اگر کاربر وارد حساب کاربری‌اش شده باشد true و در غیر این صورت false برمی‌گرداند.

متد initService در کد بالا متدی است که اتصال با بازار را برقرار می‌کند و از متد onCreate مربوط به LoginCheckActivity فراخوانی می‌شود.