2016-09-15 93 views
0

我試過並在ServiceConnection類中得到了OnServiceConnected事件。但是,如果我嘗試以「var myObject = IBinderObject as myBinderClass;」的形式將IBinder投射到我的類(它繼承了Binder,繼承IBinder),則返回null。或鑄造錯誤,如果我試圖做「var myObject =(myBinderClass)IBinderObject;」。 請,任何工作示例...如何在Mono(Xamarin)中綁定到AccessibilityService

MainActivity代碼:

namespace MyApp.Droid 
{ 
    [Activity(Label = "MyApp", Icon = "@drawable/icon", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)] 
    public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsApplicationActivity 
    { 
     AccessibilityServiceBinder binder; 
     AccessibilityServiceConnection accessibilityServiceConnection; 
     bool isBound = false, isBoundAC = false, isConfigurationChange = false; 
     protected Intent ServiceIntent; 
     AccessibilityServiceClass ServiceClass; 

     protected override void OnStart() 
     { 
      base.OnStart(); 
      if (!isBoundAC) 
      { 
       accessibilityServiceConnection = new AccessibilityServiceConnection(this); 
       isBoundAC = BindService(ServiceIntent, accessibilityServiceConnection, Bind.AutoCreate); 
       if (isBoundAC) 
       { 
       Toast.MakeText(this, "AccessibilityService is Bound", ToastLength.Long); 
       } 
      } 
     } 
     protected override void OnCreate(Bundle bundle) 
     { 
      base.OnCreate(bundle); 
      ServiceIntent = new Intent(this, typeof(AccessibilityServiceClass)); 
      ServiceIntent.SetPackage("android.accessibilityservice.AccessibilityService"); 
      global::Xamarin.Forms.Forms.Init(this, bundle); 
      LoadApplication(new App()); 
     } 
     public class AccessibilityServiceConnection : Java.Lang.Object, IServiceConnection 
     { 
      MainActivity activity; 
      AccessibilityServiceBinder binder; 
      public AccessibilityServiceBinder Binder 
      { 
       get 
       { 
       return (AccessibilityServiceBinder)binder; 
       } 
      } 
      public AccessibilityServiceConnection(MainActivity activity) 
      { 
       this.activity = activity; 
      } 
      public void OnServiceConnected(ComponentName name, IBinder service) 
      { 
       var accessibilityServiceBinder = service as AccessibilityServiceBinder; 
       //accessibilityServiceBinder is always null here 
       if (accessibilityServiceBinder != null) 
       { 
       activity.binder = accessibilityServiceBinder; 
       activity.isBound = true; 
       this.binder = accessibilityServiceBinder; 
       } 
      } 
      public void OnServiceDisconnected(ComponentName name) 
      { 
       activity.isBound = false; 
      } 
     } 
     public override Java.Lang.Object OnRetainNonConfigurationInstance() 
     { 
      base.OnRetainNonConfigurationInstance(); 
      isConfigurationChange = true; 
      return accessibilityServiceConnection; 
     } 
    } 
} 

服務代碼:

namespace MyApp.Droid 
{ 
    [Service(Label = "MyApp", Permission = Manifest.Permission.BindAccessibilityService), IntentFilter(new[] { "android.accessibilityservice.AccessibilityService" }), MetaData("android.accessibility-service", Resource = "@xml/accessibilityserviceconfig")] 
    public class AccessibilityServiceClass : Android.AccessibilityServices.AccessibilityService 
    { 
     public override void OnAccessibilityEvent(AccessibilityEvent e) 
     { 
      Toast.MakeText(this, "OnAccessibilityEvent", ToastLength.Short); 
     } 

     public override void OnInterrupt() 
     { 
      Toast.MakeText(this, "OnInterrupt", ToastLength.Short); 
     } 

     protected override void OnServiceConnected() 
     { 
      Toast.MakeText(this, "OnServiceConnected", ToastLength.Short); 
     } 
    } 
    public class AccessibilityServiceBinder : Binder 
    { 
     AccessibilityServiceClass service; 

     public AccessibilityServiceBinder(AccessibilityServiceClass service) 
     { 
      this.service = service; 
     } 

     public AccessibilityServiceClass GetAccessibilityService() 
     { 
      return service; 
     } 
    } 
} 
+0

添加您的服務代碼 – Gusman

+0

完成...謝謝。 – Gambolt

回答

0

你是不是覆蓋服務的OnBind事件,因此粘合劑是空因爲你還沒有提供實例。

添加到您的服務:

AccessibilityServiceBinder binder; 

public override IBinder OnBind (Intent intent) 
{ 
    if(binder == null) 
     binder = new AccessibilityServiceBinder (this); 

    return binder; 
} 

欲瞭解更多信息閱讀勢必服務Xamarin文檔,他們是很好的解釋:https://developer.xamarin.com/guides/android/application_fundamentals/services/part_2_-_bound_services/

編輯:總錯誤的答案(我將刪除它在幾分鐘內)。看起來無法綁定到Accessibility服務。更多的信息在這裏:android bind to AccessibilityService

+0

謝謝,但它表示,OnBind是密封的,不能被重寫... – Gambolt

+0

AccessibilityServiceClass繼承Android.AccessibilityServices.AccessibilityService,而不是Android.App.Service – Gambolt

+0

是的,我的錯,我看到內部實現創建一個IAccessibilityServiceClientWrapper(來源:https://sourcegraph.com/android.googlesource.com/platform/frameworks/base/-/info/JavaArtifact/AndroidSDK/-/android/accessibilityservice/AccessibilityService:type/onBind:android.content.Intent)so我認爲accesibility服務不應該被綁定,一些其他職位陳述這(http://stackoverflow.com/questions/9683927/android-bind-to-accessibilityservice) – Gusman