نسخه چاپی

توجه:

این امکان از نسخه ۶.۵ به بعد بازار در دسترس است.

با استفاده از این امکان می‌توانید از وضعیت ورود (Login) کاربر به حساب کاربری‌اش در برنامه بازار مطلع شوید.

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

فرض کنید می‌خواهید وضعیت Login کاربر را داخل 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");
    }
}

زمانی‌که می‌خواهید وضعیت Login کاربر را بررسی کنید، باید این سرویس را با استفاده از 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();
	...
}

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

boolean isLoggedIn = service.isLoggedIn();

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

به مطالب ارائه شده چه امتیازی می‌دهید؟
محل نوشتن دیدگاه ...

اگر در مورد محتوا نظر یا پیشنهادی دارید لطفا برای ما بنویسید.

زمان انتشار: ۱۴۰۰-۰۳-۲۵ ۱۷:۳۲

آخرین به‌روزرسانی: ۱۴۰۰-۰۵-۰۹ ۰۹:۴۷