アプリ間での呼び出しとパラメータの受け渡しについて(Deep Link / App Links)-Android編- | Xamarin.Forms
- 2017/07/08
- 15:05
今回はアプリ間の連携方法についてご紹介いたします。呼び出し元のアプリAから呼び出し先のアプリBを呼び出し、パラメータを受け渡す方法についてご説明いたします。iOS編は次回の記事にてご紹介しています。

前提条件
・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.csOnButtonClick(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
- 関連記事
-
- MainActivityのインスタンスを取得する方法 | Xamarin.Forms
- アプリ間での呼び出しとパラメータの受け渡しについて(Deep Link / App Links)-iOS編- | Xamarin.Forms
- アプリ間での呼び出しとパラメータの受け渡しについて(Deep Link / App Links)-Android編- | Xamarin.Forms
- -Androidリリース編- Google SignInの設定方法 | Xamarin.Forms
- Google SignInの配信用APKのSHA1フィンガープリントを取得する方法 | Xamarin.Forms
アプリ間での呼び出しとパラメータの受け渡しについて(Deep Link / App Links)-iOS編- | Xamarin.Forms ホーム
-Androidリリース編- Google SignInの設定方法 | Xamarin.Forms