SlideShare ist ein Scribd-Unternehmen logo
1 von 40
Downloaden Sie, um offline zu lesen
OnActivityResult
kyobashi.dex #4
おまえら!もうonActivityResultでswitchとif書く時代は終わりだぞ!
About Me
Shinobu Okano
@operandoOS
Mercari, Inc.
Souzoh, Inc.
Do you know
onActivityResult?
Do you know onActivityResult?
https://developer.android.com/
training/basics/intents/result.html
Getting a Result from an Activity
Getting a Result from an Activity
// Start the Activity
static final int PICK_CONTACT_REQUEST = 1; // The request code
private void pickContact() {
Intent pickContactIntent = new Intent(Intent.ACTION_PICK, Uri.parse("content://contacts"));
pickContactIntent.setType(Phone.CONTENT_TYPE); // Show user only contacts w/ phone numbers
startActivityForResult(pickContactIntent, PICK_CONTACT_REQUEST);
}
// Receive the Result
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == PICK_CONTACT_REQUEST) {
if (resultCode == RESULT_OK) {
// ...
}
}
}
某フリマアプリから拝借した

onActivityResult
※定数名とかそこら辺は変えてます
某フリマアプリ onActivityResult
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch(requestCode) {
case LOGIN:
if(resultCode == RESULT_OK) {
success();
} else {
failed();
}
break;
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(resultCode != RESULT_OK) return;
switch (requestCode) {
case REQUEST_MUGAMUGA:
successItemPost();
break;
}
}
某フリマアプリ onActivityResult
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode != RESULT_OK || data == null) {
mugemuge();
return;
}
if (requestCode == Request.UMUUMU) {
umuumu();
}
}
某フリマアプリ onActivityResult
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == Activity.RESULT_CANCELED) {
cancel();
} else if (requestCode == REQUEST_CODE_SELECT_IMAGE) {
// ....
} else if (requestCode == REQUEST_CODE_TRIMMING) {
// ....
} else {
super.onActivityResult(requestCode, resultCode, data);
}
}
某フリマアプリ onActivityResult
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_MUGAMUGA && resultCode == Activity.RESULT_OK) {
if (data != null) {
mugamuga();
}
}
}
某フリマアプリ onActivityResult
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode != Activity.RESULT_OK) {
return;
}
switch (requestCode) {
case REQUEST_CODE_CATEGORY:
// ...
break;
case REQUEST_CODE_LOCATION:
// ...
break;
case REQUEST_CODE_CONDITION:
// ...
break;
default:
super.onActivityResult(requestCode, resultCode, data);
break;
}
}
某フリマアプリ onActivityResult
onActivityResultの悪さ
• switchとifが多い
• requestCodeとresultCodeをチェックしないといけない
• switchとifの書き方がまちまち
• switch使わない勢 + if else勢😇
• requestCodeとresultCodeどっちに先に判定するか問題
• 人間が書くにはつらい...
Do you know
OnActivityResult?
OnActivityResult
OnActivityResult annotation compiler
for Android
https://github.com/vanniktech/OnActivityResult
アッテの

onActivityResultの実装は

すべてOnActivityResultです!
onActivityResultの実装がこれだけ!!
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
ActivityResult.onResult(requestCode, resultCode, data).into(this);
}
すぎょい😆
受け取ったあとの実装は??
• それぞのたパターンにあったメソッドを定義して
@OnActivityResultをつける
• @OnActivityResultのrequestCodeとresultCodesで

どういう結果の場合に呼び出してほしいかを定義する
受け取ったあとの実装は??
@OnActivityResult(requestCode = REQUEST_TAKE_PHOTO, resultCodes = RESULT_OK)
void onTakePhoto(@ExtraString(name = CameraActivity.RESULT_TAKE_PHOTO)
final String takePhoto) {
Intent resultIntent = new Intent();
resultIntent.putExtra(RESULT_TAKE_PHOTO, takePhoto);
setResult(RESULT_CODE_TAKE_PHOTO, resultIntent);
finish();
}
受け取ったあとの実装は??
// result codeに何が返ってきても処理するメソッド
@OnActivityResult(requestCode = REQUEST_SELECT_IMAGE)
void onHumuHumu() {
Toast.makeText(this, "onHumuHumu", Toast.LENGTH_SHORT).show();
}
@OnActivityResult(requestCode = REQUEST_SELECT_IMAGE, resultCodes = RESULT_CANCELED)
void onCancel() {
Toast.makeText(this, "cancel select image.”, Toast.LENGTH_SHORT).show();
}
すぎょくない?
(みんな)
すぎょい😍
onActivityResultの受け取り先の
オブジェクトを指定する
• intoに受け取り先オブジェクトを指定する
• ActivityResult.onResult().into(obj);
• onActivityResultで返ってくるIntentのデータを
ViewModelとかPresenterで受け取る
• 設計によっては嬉しい
onActivityResultの結果を

ViewModelで受け取る
private MySampleMainViewModel viewModel = new MySampleMainViewModel();
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
ActivityResult.onResult(requestCode, resultCode, data).into(viewModel);
}
public class MySampleMainViewModel {
public ObservableField<String> location = new ObservableField<>("0,0");
@OnActivityResult(requestCode = MySampleMainActivity.REQUEST_SELECT_LOCATION,
resultCodes = Activity.RESULT_OK)
void onSelectedLocation(@Extra(name = LocationSelectActivity.RESULT_SELECT_LOCATION) Location location) {
this.location.set(location.toString());
}
}
OnActivityResult sample Code
https://github.com/operando/OnActivityResult/tree/
my_sample_code/onactivityresult-sample
https://github.com/operando/OnActivityResult/tree/my_sample_code/onactivityresult-sample/
build/generated/source/apt/debug/com/vanniktech/onactivityresult/sample
布教活動のために適当にサンプルコード書いてます
annotation processorで作成されるコードも

入れてあります
Do you know Activity.RESULT_FIRST_USER?
• Start of user-defined activity results.
• Constant Value: 1 (0x00000001)
• https://developer.android.com/reference/android/
app/Activity.html#RESULT_FIRST_USER
どういう場合に使うか
• 画面Aから画面BへRequestをする時

画面Bからの戻りが2パターン以上ある
場合
• ???
アッテの例)

募集投稿画面から画像選択をする
• 画像選択画面ではギャラリーの画像を選択するか、カメラで撮影するかの

2パターンある
• カメラ撮影はまた別画面が起動して、その戻りを画像選択画面が受け取る
• 募集投稿画面への戻りが、ギャラリーの画像を選択、カメラで撮影の2パターンある
• = 募集投稿画面から画像選択画面に対しては1Requestだけど

2パターンの戻り(Resultパターン)がある
• = 独自のResult Codeを定義したい = Activity.RESULT_FIRST_USERを使って定義
アッテの例で...
アッテの例で...
OnActivityResultで実装すると…
// ImageSelectActivity
static final int RESULT_CODE_SELECT_IMAGE = Activity.RESULT_FIRST_USER;
static final int RESULT_CODE_TAKE_PHOTO = Activity.RESULT_FIRST_USER + 1;
@OnActivityResult(requestCode = REQUEST_SELECT_IMAGE,
resultCodes = ImageSelectActivity.RESULT_CODE_SELECT_IMAGE)
void onSelectImage(Intent intent) {
ArrayList<String> selectImages = intent.getStringArrayListExtra(RESULT_SELECT_IMAGES);
Toast.makeText(this, "onSelectImage selectImages : " + selectImages, Toast.LENGTH_SHORT).show();
}
@OnActivityResult(requestCode = REQUEST_SELECT_IMAGE,
resultCodes = ImageSelectActivity.RESULT_CODE_TAKE_PHOTO)
void onTakePhoto(@ExtraString(name = ImageSelectActivity.RESULT_TAKE_PHOTO) final String takePhoto) {
Toast.makeText(this, "onTakePhoto takePhoto : " + takePhoto, Toast.LENGTH_SHORT).show();
}
Support user defined result code
https://github.com/vanniktech/
OnActivityResult/pull/86
俺が!
OnActivityResultでActivity.RESULT_FIRST_USER
使えるようにしてやったぞ!
Contributions
Contributions
Contributions
イヤッッホォォォ
オオォオウ!
OnActivityResultの気に入ってるところ
• onActivityResultメソッドの実装はシンプルになる!
• startActivityForResultの呼び出しは既存のままでいい!
• 受け取り後の処理ごとにメソッド定義するので見通しがいい
• 結果受け取り先のオブジェクトを指定できる → into()
• ifとswitchからの開放…
おまえら!
もうonActivityResultで

switchとif書く時代は

終わりだぞ!
Thanks!!

Weitere ähnliche Inhalte

Ähnlich wie OnActivityResult - おまえら!もうonActivityResultでswitchとif書く時代は終わりだぞ!

Lightweight Language Tiger 2010
Lightweight Language Tiger 2010Lightweight Language Tiger 2010
Lightweight Language Tiger 2010
biscuitjam
 
モバイル開発@symfony
モバイル開発@symfonyモバイル開発@symfony
モバイル開発@symfony
Daichi Kamemoto
 
Tech talk salesforce mobile sdk
Tech talk   salesforce mobile sdkTech talk   salesforce mobile sdk
Tech talk salesforce mobile sdk
Kazuki Nakajima
 
20111031 MobileWeb at TDC
20111031 MobileWeb at TDC20111031 MobileWeb at TDC
20111031 MobileWeb at TDC
Nobuhiro Sue
 

Ähnlich wie OnActivityResult - おまえら!もうonActivityResultでswitchとif書く時代は終わりだぞ! (20)

Lightweight Language Tiger 2010
Lightweight Language Tiger 2010Lightweight Language Tiger 2010
Lightweight Language Tiger 2010
 
ネットワーク自動化、なに使う? ~自動化ツール紹介~ (2017/07/21開催)
ネットワーク自動化、なに使う? ~自動化ツール紹介~ (2017/07/21開催)ネットワーク自動化、なに使う? ~自動化ツール紹介~ (2017/07/21開催)
ネットワーク自動化、なに使う? ~自動化ツール紹介~ (2017/07/21開催)
 
モバイル開発@symfony
モバイル開発@symfonyモバイル開発@symfony
モバイル開発@symfony
 
ハンズオン勉強会 はじめてのJavaScriptとSPARQL
ハンズオン勉強会 はじめてのJavaScriptとSPARQLハンズオン勉強会 はじめてのJavaScriptとSPARQL
ハンズオン勉強会 はじめてのJavaScriptとSPARQL
 
Tech talk salesforce mobile sdk
Tech talk   salesforce mobile sdkTech talk   salesforce mobile sdk
Tech talk salesforce mobile sdk
 
ネットワーク自動化、なに使う? ~自動化ツール紹介~(2017/08/18追加開催)
ネットワーク自動化、なに使う? ~自動化ツール紹介~(2017/08/18追加開催) ネットワーク自動化、なに使う? ~自動化ツール紹介~(2017/08/18追加開催)
ネットワーク自動化、なに使う? ~自動化ツール紹介~(2017/08/18追加開催)
 
もう怖くないモバイルアプリ開発!
もう怖くないモバイルアプリ開発!もう怖くないモバイルアプリ開発!
もう怖くないモバイルアプリ開発!
 
エンタープライズIT環境での OpenID Connect / SCIM の具体的実装方法 idit2014
エンタープライズIT環境での OpenID Connect / SCIM の具体的実装方法 idit2014エンタープライズIT環境での OpenID Connect / SCIM の具体的実装方法 idit2014
エンタープライズIT環境での OpenID Connect / SCIM の具体的実装方法 idit2014
 
Meetup11 contacts api読んでみた
Meetup11 contacts api読んでみたMeetup11 contacts api読んでみた
Meetup11 contacts api読んでみた
 
openFrameworks iOS 入門
openFrameworks iOS 入門openFrameworks iOS 入門
openFrameworks iOS 入門
 
Androidリリース作業の効率化(2)
Androidリリース作業の効率化(2)Androidリリース作業の効率化(2)
Androidリリース作業の効率化(2)
 
JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」
JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」
JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」
 
AOZORAYOMITE and Intent
AOZORAYOMITE and IntentAOZORAYOMITE and Intent
AOZORAYOMITE and Intent
 
Android4.2徹底解剖!
Android4.2徹底解剖!Android4.2徹底解剖!
Android4.2徹底解剖!
 
20111031 MobileWeb at TDC
20111031 MobileWeb at TDC20111031 MobileWeb at TDC
20111031 MobileWeb at TDC
 
JVMに裏から手を出す!JVMTIに触れてみよう(オープンソースカンファレンス2020 Online/Hiroshima 講演資料)
JVMに裏から手を出す!JVMTIに触れてみよう(オープンソースカンファレンス2020 Online/Hiroshima 講演資料)JVMに裏から手を出す!JVMTIに触れてみよう(オープンソースカンファレンス2020 Online/Hiroshima 講演資料)
JVMに裏から手を出す!JVMTIに触れてみよう(オープンソースカンファレンス2020 Online/Hiroshima 講演資料)
 
AndroidでDIxAOP
AndroidでDIxAOPAndroidでDIxAOP
AndroidでDIxAOP
 
JavaScript 実践講座 Framework, Tool, Performance
JavaScript 実践講座 Framework, Tool, PerformanceJavaScript 実践講座 Framework, Tool, Performance
JavaScript 実践講座 Framework, Tool, Performance
 
JobScheduler Code Reading
JobScheduler Code ReadingJobScheduler Code Reading
JobScheduler Code Reading
 
Rx java x retrofit
Rx java x retrofitRx java x retrofit
Rx java x retrofit
 

Mehr von Shinobu Okano

Mehr von Shinobu Okano (20)

Android Framework Code Readingのしおり ver 1.2
Android Framework Code Readingのしおり ver 1.2Android Framework Code Readingのしおり ver 1.2
Android Framework Code Readingのしおり ver 1.2
 
まったりAndroid Framework Code Reading #4
まったりAndroid Framework Code Reading #4まったりAndroid Framework Code Reading #4
まったりAndroid Framework Code Reading #4
 
shinobu.apk #3
shinobu.apk #3shinobu.apk #3
shinobu.apk #3
 
Android + JSON-RPC
Android + JSON-RPCAndroid + JSON-RPC
Android + JSON-RPC
 
Inside Android N
Inside Android NInside Android N
Inside Android N
 
Gradle PluginとCIと俺
Gradle PluginとCIと俺Gradle PluginとCIと俺
Gradle PluginとCIと俺
 
shinobu.apk #2
shinobu.apk #2shinobu.apk #2
shinobu.apk #2
 
まったりAndroid Framework Code Reading #3
まったりAndroid Framework Code Reading #3まったりAndroid Framework Code Reading #3
まったりAndroid Framework Code Reading #3
 
Android Framework Code Readingのしおり ver 1.1
Android Framework Code Readingのしおり ver 1.1Android Framework Code Readingのしおり ver 1.1
Android Framework Code Readingのしおり ver 1.1
 
Kotlinにお触り
Kotlinにお触りKotlinにお触り
Kotlinにお触り
 
DroidKaigiアプリをSpoonで全画面スクショするぞい\(^o^)/
DroidKaigiアプリをSpoonで全画面スクショするぞい\(^o^)/DroidKaigiアプリをSpoonで全画面スクショするぞい\(^o^)/
DroidKaigiアプリをSpoonで全画面スクショするぞい\(^o^)/
 
Gradle PluginとTwitterとズン ドコ キ・ヨ・シ!
Gradle PluginとTwitterとズン ドコ キ・ヨ・シ!Gradle PluginとTwitterとズン ドコ キ・ヨ・シ!
Gradle PluginとTwitterとズン ドコ キ・ヨ・シ!
 
ChromeとAndroidの過去・現在・未来
ChromeとAndroidの過去・現在・未来ChromeとAndroidの過去・現在・未来
ChromeとAndroidの過去・現在・未来
 
Android Dev Tools Knowledge
Android Dev Tools KnowledgeAndroid Dev Tools Knowledge
Android Dev Tools Knowledge
 
shinobu.apk #1
shinobu.apk #1shinobu.apk #1
shinobu.apk #1
 
ChromeとAndroidの 過去・現在・未来 ver 0.1
ChromeとAndroidの 過去・現在・未来  ver 0.1ChromeとAndroidの 過去・現在・未来  ver 0.1
ChromeとAndroidの 過去・現在・未来 ver 0.1
 
5分で資料作ってSlideShareにアップロードする錬金術
5分で資料作ってSlideShareにアップロードする錬金術5分で資料作ってSlideShareにアップロードする錬金術
5分で資料作ってSlideShareにアップロードする錬金術
 
Logcatの話
Logcatの話Logcatの話
Logcatの話
 
GarumとMeteoriteと私 3nd Edition ver0.04
GarumとMeteoriteと私 3nd Edition ver0.04GarumとMeteoriteと私 3nd Edition ver0.04
GarumとMeteoriteと私 3nd Edition ver0.04
 
Android Framework Code Readingのしおり
Android Framework Code ReadingのしおりAndroid Framework Code Readingのしおり
Android Framework Code Readingのしおり
 

Kürzlich hochgeladen

Kürzlich hochgeladen (12)

新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 

OnActivityResult - おまえら!もうonActivityResultでswitchとif書く時代は終わりだぞ!