সাধারণ ব্যবহারের বাইন্ডটি অটো তৈরি করবেন না - পিএস দেখুন। এবং আপডেট ...
public abstract class Context {
...
/*
* @return {true} If you have successfully bound to the service,
* {false} is returned if the connection is not made
* so you will not receive the service object.
*/
public abstract boolean bindService(@RequiresPermission Intent service,
@NonNull ServiceConnection conn, @BindServiceFlags int flags);
উদাহরণ:
Intent bindIntent = new Intent(context, Class<Service>);
boolean bindResult = context.bindService(bindIntent, ServiceConnection, 0);
কেন ব্যবহার করছেন না? getRunningServices ()
List<ActivityManager.RunningServiceInfo> getRunningServices (int maxNum)
Return a list of the services that are currently running.
দ্রষ্টব্য: এই পদ্ধতিটি কেবল পরিষেবা পরিচালনার ধরণের ব্যবহারকারী ইন্টারফেসগুলি ডিবাগিং বা প্রয়োগের জন্য is
পুনশ্চ. অ্যান্ড্রয়েড ডকুমেন্টেশন বিভ্রান্ত করছে যে কোনও সন্দেহ দূর করতে আমি গুগল ট্র্যাকারে একটি সমস্যা খুলেছি:
https://issuetracker.google.com/issues/68908332
যেহেতু আমরা দেখতে পাই বাঁধাই পরিষেবাটি আসলে পরিষেবা ক্যাশে বাইন্ডারগুলির মাধ্যমে অ্যাক্টিভিটি ম্যানেজার বাইন্ডারের মাধ্যমে একটি লেনদেনের জন্য আহ্বান জানায় - আমি জানতে পারি কোন বাঁধাইয়ের জন্য দায়ী কোন পরিষেবা তবে আমরা দেখতে পাচ্ছি যে বাইন্ডের ফলাফলটি হ'ল:
int res = ActivityManagerNative.getDefault().bindService(...);
return res != 0;
লেনদেন বাইন্ডারের মাধ্যমে করা হয়:
ServiceManager.getService("activity");
পরবর্তী:
public static IBinder getService(String name) {
try {
IBinder service = sCache.get(name);
if (service != null) {
return service;
} else {
return getIServiceManager().getService(name);
এটি এর মাধ্যমে অ্যাক্টিভিটি থ্রেডে সেট করা আছে:
public final void bindApplication(...) {
if (services != null) {
// Setup the service cache in the ServiceManager
ServiceManager.initServiceCache(services);
}
এটিকে এক্টিভিটি ম্যানেজারসেবা পদ্ধতিতে বলা হয়:
private final boolean attachApplicationLocked(IApplicationThread thread,
int pid) {
...
thread.bindApplication(... , getCommonServicesLocked(),...)
তারপর:
private HashMap<String, IBinder> getCommonServicesLocked() {
তবে কোনও "ক্রিয়াকলাপ" নেই কেবল উইন্ডো প্যাকেজ এবং অ্যালার্ম ..
সুতরাং আমাদের ফিরে কল করা প্রয়োজন:
return getIServiceManager().getService(name);
sServiceManager = ServiceManagerNative.asInterface(BinderInternal.getContextObject());
এটি কল মাধ্যমে কল করে:
mRemote.transact(GET_SERVICE_TRANSACTION, data, reply, 0);
যা বাড়ে :
BinderInternal.getContextObject()
এবং এটি স্থানীয় পদ্ধতি ....
/**
* Return the global "context object" of the system. This is usually
* an implementation of IServiceManager, which you can use to find
* other services.
*/
public static final native IBinder getContextObject();
আমার কাছে এখন আর সি খনন করার সময় নেই যাতে আমি বিশ্রাম কলটি ছড়িয়ে না দেওয়া পর্যন্ত আমি আমার উত্তর স্থগিত করি।
তবে পরিষেবাটি চলছে কিনা তা যাচাই করার সর্বোত্তম উপায় হ'ল বাঁধাই তৈরি করা (যদি বাইন্ড তৈরি না করা পরিষেবাটি বিদ্যমান না থাকে) - এবং বাইন্ডের মাধ্যমে পরিষেবাটিকে তার রাজ্য সম্পর্কে জিজ্ঞাসা করুন (এটিতে স্টোরের অভ্যন্তরীণ পতাকা ব্যবহার করে)।
আপডেট 23.06.2018
আমি আকর্ষণীয় পেয়েছি:
/**
* Provide a binder to an already-bound service. This method is synchronous
* and will not start the target service if it is not present, so it is safe
* to call from {@link #onReceive}.
*
* For peekService() to return a non null {@link android.os.IBinder} interface
* the service must have published it before. In other words some component
* must have called {@link android.content.Context#bindService(Intent, ServiceConnection, int)} on it.
*
* @param myContext The Context that had been passed to {@link #onReceive(Context, Intent)}
* @param service Identifies the already-bound service you wish to use. See
* {@link android.content.Context#bindService(Intent, ServiceConnection, int)}
* for more information.
*/
public IBinder peekService(Context myContext, Intent service) {
IActivityManager am = ActivityManager.getService();
IBinder binder = null;
try {
service.prepareToLeaveProcess(myContext);
binder = am.peekService(service, service.resolveTypeIfNeeded(
myContext.getContentResolver()), myContext.getOpPackageName());
} catch (RemoteException e) {
}
return binder;
}
সংক্ষেপে :)
"ইতিমধ্যে সীমাবদ্ধ পরিষেবাকে একটি বাইন্ডার সরবরাহ করুন This এই পদ্ধতিটি সিঙ্ক্রোনাস এবং এটি উপস্থিত না থাকলে লক্ষ্য পরিষেবাটি শুরু করবে না।"
পাবলিক আইবাইন্ডার পিক সার্ভিস (ইনটেন্ট সার্ভিস, স্ট্রিং রিলিজড টাইপ, স্ট্রিং কলিংপ্যাকেজ) রিমোটএক্সেপশন ছুড়ে ফেলে;
*
public static IBinder peekService(IBinder remote, Intent service, String resolvedType)
throws RemoteException {
Parcel data = Parcel.obtain();
Parcel reply = Parcel.obtain();
data.writeInterfaceToken("android.app.IActivityManager");
service.writeToParcel(data, 0);
data.writeString(resolvedType);
remote.transact(android.os.IBinder.FIRST_CALL_TRANSACTION+84, data, reply, 0);
reply.readException();
IBinder binder = reply.readStrongBinder();
reply.recycle();
data.recycle();
return binder;
}
*