記事一覧

アプリ間での呼び出しとパラメータの受け渡しについて(Deep Link / App Links)-Android編- | Xamarin.Forms


今回はアプリ間の連携方法についてご紹介いたします。呼び出し元のアプリAから呼び出し先のアプリBを呼び出し、パラメータを受け渡す方法についてご説明いたします。iOS編は次回の記事にてご紹介しています。


xamarin_deeplink_01.png


前提条件
・Windows10 Pro 64Bit
・Visual Studio 2015 Community Update3
・Xamarin 4.3.0.795 (NuGet Xamarin.Forms 2.3.4.247)
・macOS Sierra 10.12.4 / Xcode8.3.1 / Xamarin.iOS 10.6.0.10


1.言葉の定義

まず始めに、説明させていただく言葉の定義について
・アプリA:呼び出し元のアプリ(通常のアプリ)
・アプリB:呼び出し先のアプリ(ファイルを開く為のエクスプローラ型のアプリ)


2.PCLの記述

それぞれのアプリにDependencyServiceから利用する為のインターフェースを用意します。

アプリAのIApplicationService.cs
namespace AppNameA.Services
{
    //DependencyServiceから利用する
    public interface IApplicationService
    {
        void Start(string param);
        event EventHandler ReturnParamSetted;
        string GetReturnParam();
    }
}

アプリBのIApplicationService.cs
namespace AppNameB.Services
{
    //DependencyServiceから利用する
    public interface IApplicationService
    {
        //Intentを戻す機能
        void ReturnApp(string param);
    }
}


3.Android実装方法

(1)アプリAからアプリBを呼び出し
(2)アプリBを終了しアプリAで結果を受けとる

アプリAのApplicationService.cs
[assembly: Dependency(typeof(ApplicationService))]
namespace AppNameA.Droid.Services
{
    public class ApplicationService : IApplicationService
    {
        public static ApplicationService Instance = null;
        public event EventHandler ReturnParamSetted;
        public static string ReturnParam= String.Empty;

        public void Start(string param)
        {
            //現在のインスタンスを保持しておく
            ApplicationService.Instance = this;

            //アクティビティを取得する
            var activity = (Activity)(Forms.Context);

            //呼び出すインテントを作成する
            Intent intent = new Intent(Intent.ActionGetContent);
            intent.SetType("file/*");
            if (!String.IsNullOrEmpty(param))
            {
                //パラメータをセットする
                intent.PutExtra("parametername", param);
            }
               
            activity.StartActivityForResult(
            Intent.CreateChooser(intent, "Select Backup File"), 12345); //数字は任意の番号。OnActivityResultで識別する番号
        }

        //戻りのパラメータを取得した際に呼び出す。
        public void OnReturnParamSetted()
        {
            if (ApplicationService.Instance != null)
            {
                ApplicationService.Instance.ReturnParamSetted(null, new EventArgs());
            }
        }

        //PCLからパラメータを取得する
        public string GetReturnParam()
        {
            return ReturnParam;
        }
    }
}

アプリAのMainActivity.cs
protected override void OnActivityResult(int requestCode, Result resultCode, global::Android.Content.Intent data)
{
    //アプリBからの戻り
    if (requestCode == 12345)    //インテントを呼び出した際につけた番号
    {
        if (resultCode == Result.Ok)
        {
            if (data.HasExtra("parametername"))
            {
                //戻り値を取得する
                ApplicationService.ReturnParam = data.GetStringExtra("parametername");
                ApplicationService.Instance.OnReturnParamSetted();
            }
        }
        return;
    }
}


アプリBのMainActivity.cs
[IntentFilter(new[] { Intent.ActionPick }, 
                Categories = new[] { Intent.CategoryDefault },
                DataScheme = "file"
    )]
[IntentFilter(new[] { Intent.ActionGetContent },
                Categories = new[] { Intent.CategoryDefault, 
                                                Intent.CategoryOpenable },
                DataMimeType = "*/*"
    )]
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsApplicationActivity
{
    protected override void OnCreate(Bundle bundle)
    {         
        base.OnCreate(bundle);
        global::Xamarin.Forms.Forms.Init(this, bundle);
               
        //Intentを受け取る
        Intent intent = this.Intent;
        string action = intent.Action;
        string param = string.Empty;
        if (action != null &&
            (action.Equals(Intent.ActionPick) || action.Equals(Intent.ActionGetContent)))
        {
            if (intent.Data != null)
            {
                param = intent.Data.ToString();
            }
            if (intent.HasExtra("parametername"))
            {
//アプリAからのパラメータを取得する
                param = intent.GetStringExtra("parametername");
            }
        }
        //App.csのコンストラクタをオーバーロードし取得したパラメータを渡す。
        LoadApplication(new App(param));
    }
}


アプリBのApplicationService.cs
[assembly: Dependency(typeof(ApplicationService))]
namespace AppNameB.Droid.Services
{
    public class ApplicationService : IApplicationService
    {
        //Intentを戻す機能
        public void ReturnApp(string param)
        {
            //アクティビティを取得する
            var activity = (Activity)(Forms.Context);

            //アプリAのインテントを作成する
            Intent intent = new Intent();
            intent.PutExtra("parametername", param);
            
            activity.SetResult(Result.Ok, intent);
            activity.Finish();
        }
    }
}


4.使用方法

アプリAのTestPage.xaml.cs
OnButtonClick(object sender, EventArgs e)
{
    //イベントの紐づけ
    DependencyService.Get<IApplicationService>().ReturnParamSetted += this.OnParameterSetted;
//アプリBを起動してパラメータを受け渡す。
    string param = "test";
    DependencyService.Get<IApplicationService>().Start(param);
}
void OnParameterSetted(object sender, EventArgs e)
{
    //アプリBでセットしたパラメータを取得する
    string param = DependencyService.Get<IApplicationService>().GetReturnParam();
}

アプリBのTestPage.xaml.cs
OnButtonClick(object sender, EventArgs e)
{
//アプリBを終了してアプリAにパラメータを受け渡す。
    string param = "returnvalue";
    DependencyService.Get<IApplicationService>().ReturnApp(param);
}


5.iOSの実装方法

次回の記事にてご紹介しております。




当ブログの内容をまとめた Xamarin逆引きメニュー は以下のURLからご覧になれます。
http://itblogdsi.blog.fc2.com/blog-entry-81.html


関連記事

コメント

コメントの投稿

アルバム

広告

プロフィール

石河 純


著者名 :石河 純
自己紹介:素人上がりのIT技術者。趣味は卓球・車・ボウリング

IT関連の知識はざっくりとこんな感じです。
【OS関連】
WindowsServer: 2012/2008R2/2003/2000/NT4
Windows: 10/8/7/XP/2000/me/NT4/98
Linux: CentOS RedHatLinux9
Mac: macOS Sierra 10.12 / OSX Lion 10.7.5 / OSX Snow Leopard 10.6.8
【言語・データベース】
VB.net ASP.NET C#.net Java VBA
Xamarin.Forms
Oracle10g SQLServer2008R2 SQLAnywhere8/11/16
ActiveReport CrystalReport ReportNet(IBM)
【ネットワーク関連】
CCNP シスコ技術者認定
Cisco Catalyst シリーズ
Yamaha RTXシリーズ
FireWall関連
【WEB関連】
SEO SEM CSS IIS6/7 apache2

休みの日は卓球をやっています。
現在、卓球用品通販ショップは休業中です。