fc2ブログ

記事一覧

アプリ間での呼び出しとパラメータの受け渡しについて(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
using AppName.Services;
using Xamarin.Forms;
public class TestPage : ContentPage
{
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
using AppName.Services;
using Xamarin.Forms;
public class TestPage : ContentPage
{
OnButtonClick(object sender, EventArgs e)
{
//アプリBを終了してアプリAにパラメータを受け渡す。
    string param = "returnvalue";
    DependencyService.Get<IApplicationService>().ReturnApp(param);
}
}



5.iOSの実装方法

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




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


関連記事

コメント

コメントの投稿

※名前とタイトルが入力されていないコメントでは他のコメントとの区別ができません。

 入力されていないコメントには返信しませんのであらかじめご了承くださいませ。

※ニックネームでも良いので必ずご入力ください。

    

※必ずご入力ください。

    
    

※必ずご入力ください。

※技術的な質問には環境やエラーについて正確かつ詳細にお教えください。

・正確なエラーの内容

・Windowsのバージョン番号

・Visual Studioのバージョン

・機器の型番

・アプリやソフトのバージョン

    

カテゴリ別記事一覧

広告

プロフィール

石河 純


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

IT関連の知識はざっくりとこんな感じです。
【OS関連】
WindowsServer: 2012/2008R2/2003/2000/NT4
Windows: 10/8/7/XP/2000/me/NT4/98
Linux: CentOS RedHatLinux9
Mac: macOS Catalina 10.15 / Mojave 10.14 / High Sierra 10.13 / Sierra 10.12 / OSX Lion 10.7.5 / OSX Snow Leopard 10.6.8
【言語】
VB.net ASP.NET C#.net Java VBA
Xamarin.Forms
【データベース】
Oracle 10g/9i
SQLServer 2016/2008R2/2005/2000
SQLAnywhere 16/11/8
【BI/レポートツール】
Cognos ReportNet (IBM)
Microsoft PowerBI
ActiveReport (GrapeCity)
CrystalReport
【OCX関連】
GrapeCity InputMan SPREAD MultiRow GridView
【ネットワーク関連】
CCNP シスコ技術者認定
Cisco Catalyst シリーズ
Yamaha RTXシリーズ
FireWall関連
【WEB関連】
SEO SEM CSS jQuery IIS6/7 apache2

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