<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Androidアプリ開発</title>
	<atom:link href="https://techgrowup.net/tag/android%E3%82%A2%E3%83%97%E3%83%AA%E9%96%8B%E7%99%BA/feed/" rel="self" type="application/rss+xml" />
	<link>https://techgrowup.net</link>
	<description>エンジニアを強くする</description>
	<lastBuildDate>Thu, 31 Oct 2024 09:39:57 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://techgrowup.net/wp-content/uploads/2021/05/hp-icon-150x150.png</url>
	<title>Androidアプリ開発</title>
	<link>https://techgrowup.net</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Flutter開発入門 ObjectBoxでデータ管理</title>
		<link>https://techgrowup.net/flutter-objectbox/</link>
					<comments>https://techgrowup.net/flutter-objectbox/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[techgrowup]]></dc:creator>
		<pubDate>Sat, 24 Aug 2024 13:40:16 +0000</pubDate>
				<category><![CDATA[Flutter]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[Androidアプリ開発]]></category>
		<category><![CDATA[Dartプログラミング]]></category>
		<category><![CDATA[DB]]></category>
		<category><![CDATA[ObjectBox]]></category>
		<guid isPermaLink="false">https://techgrowup.net/?p=1627</guid>

					<description><![CDATA[はじめに 　本記事ではFlutterのObjectBoxの利用方法とサンプルを記載します。VSCodeを用いて実施するので環境構築が住んでいない方は以下をご覧ください 　ObjectBoxは、高速なトランザクションを実現 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h1 class="wp-block-heading">はじめに</h1>



<p>　本記事ではFlutterの<a rel="noopener" target="_blank" href="https://pub.dev/packages/objectbox">ObjectBox<span class="fa fa-external-link external-icon anchor-icon"></span></a>の利用方法とサンプルを記載します。VSCodeを用いて実施するので環境構築が住んでいない方は以下をご覧ください</p>



<figure class="wp-block-embed is-type-wp-embed is-provider-techgrowup wp-block-embed-techgrowup"><div class="wp-block-embed__wrapper">

<a target="_self" href="https://techgrowup.net/flutter-vscode/" title="Flutter開発入門 VSCodeを使った開発" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://techgrowup.net/wp-content/uploads/2024/08/flutter-vscode-160x90.webp" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://techgrowup.net/wp-content/uploads/2024/08/flutter-vscode-160x90.webp 160w, https://techgrowup.net/wp-content/uploads/2024/08/flutter-vscode-1024x585.webp 1024w, https://techgrowup.net/wp-content/uploads/2024/08/flutter-vscode-768x439.webp 768w, https://techgrowup.net/wp-content/uploads/2024/08/flutter-vscode-120x68.webp 120w, https://techgrowup.net/wp-content/uploads/2024/08/flutter-vscode-320x180.webp 320w, https://techgrowup.net/wp-content/uploads/2024/08/flutter-vscode-376x212.webp 376w, https://techgrowup.net/wp-content/uploads/2024/08/flutter-vscode.webp 1200w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Flutter開発入門 VSCodeを使った開発</div><div class="blogcard-snippet internal-blogcard-snippet">この記事では、VSCodeを活用したFlutter開発の手順を初心者から経験者まで分かりやすく解説します。Flutter SDKのセットアップから、アプリの実行、デバッグ、ビルド、デプロイまでの詳細なプロセスを学び、開発効率を最大化しましょう。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://techgrowup.net" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">techgrowup.net</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2024.08.27</div></div></div></div></a>
</div></figure>



<p>　<a rel="noopener" target="_blank" href="https://pub.dev/packages/objectbox">ObjectBox<span class="fa fa-external-link external-icon anchor-icon"></span></a>は、高速なトランザクションを実現するために特化したモバイルとIoT向けの軽量データベースです。他のデータベースライブラリと比較して、ObjectBoxの主な利点は以下の通りです。<br>　また、2024年８月時点で更新されているので、オープンソース上の開発も盛んに行われています。</p>



<ul class="wp-block-list">
<li><strong>高速性</strong>: ObjectBoxは読み書きの速度が非常に速く、大量のデータ操作でも効率的に処理します。</li>



<li><strong>リソース効率</strong>: 非常に少ないメモリとストレージを使用し、リソースが限られたデバイスでも高いパフォーマンスを発揮します。</li>



<li><strong>開発の容易さ</strong>: ObjectBoxのAPIはシンプルで直感的なため、開発者は短時間でデータベース操作を学び、適用することが可能です。</li>
</ul>



<p>これらの特性により、ObjectBoxはモバイルデバイスやIoTデバイスに最適な選択肢となっています。</p>



<h2 class="wp-block-heading">2. 環境設定</h2>



<p>　　では実際にFlutterプロジェクトを作成するところから始めていきます。プロジェクト名は「objectbox_sample」としました。</p>



<ol class="wp-block-list">
<li><strong>Flutterプロジェクトの作成</strong>:
<ul class="wp-block-list">
<li>Visual Studio Codeを開き、コマンドパレット (<code>Ctrl+Shift+P</code> / <code>Cmd+Shift+P</code>) を使用して「Flutter: New Project」と入力します。</li>



<li>プロジェクトの種類を選択し、プロジェクト名と保存先を指定してプロジェクトを作成します。</li>
</ul>
</li>



<li><span class="bold">ObjectBox Flutterの依存関係を追加</span>:
<ul class="wp-block-list">
<li><code>pubspec.yaml</code> ファイルを開き、dependenciesセクションに<code>objectbox_flutter_libs、objectbox、</code>objectbox_generator、build_runnerを追加します。</li>
</ul>
</li>
</ol>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="dependencies:
  flutter:
    sdk: flutter

  objectbox: ^4.0.2 #ここを追加
  objectbox_flutter_libs: any #ここを追加

dev_dependencies:
  flutter_test:
    sdk: flutter

  objectbox_generator: any  #ここを追加
  build_runner: ^2.4.12 #ここを追加" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">dependencies</span><span style="color: #D4D4D4">:</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">flutter</span><span style="color: #D4D4D4">:</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">sdk</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">flutter</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">objectbox</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">^4.0.2</span><span style="color: #D4D4D4"> </span><span style="color: #6A9955">#ここを追加</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">objectbox_flutter_libs</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">any</span><span style="color: #D4D4D4"> </span><span style="color: #6A9955">#ここを追加</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">dev_dependencies</span><span style="color: #D4D4D4">:</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">flutter_test</span><span style="color: #D4D4D4">:</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">sdk</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">flutter</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">objectbox_generator</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">any</span><span style="color: #D4D4D4">  </span><span style="color: #6A9955">#ここを追加</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">build_runner</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">^2.4.12</span><span style="color: #D4D4D4"> </span><span style="color: #6A9955">#ここを追加</span></span></code></pre></div>



<ol start="3" class="wp-block-list">
<li><strong>パッケージのインストール</strong>:
<ul class="wp-block-list">
<li>以下コマンドを叩いてパッケージをインストールします。</li>
</ul>
</li>



<li></li>
</ol>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="flutter pub get" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">flutter</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">pub</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">get</span></span></code></pre></div>



<h2 class="wp-block-heading">3. モデルの定義</h2>



<p>　ここでは簡単なモデルを作成します。user.dartを作成して以下を記述します。<br>ポイントとしては@Entity()でエンティティの定義をしていることと、idは必須になるので定義しています。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="import 'package:objectbox/objectbox.dart';

@Entity()
class User {
  int id = 0; // ObjectBoxはデフォルトでidを必要とします。

  String name;
  int age;

  User({this.id = 0, required this.name, required this.age});
}" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">import</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;package:objectbox/objectbox.dart&#39;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">@Entity</span><span style="color: #D4D4D4">()</span></span>
<span class="line"><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">User</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #4EC9B0">int</span><span style="color: #D4D4D4"> id = </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">; </span><span style="color: #6A9955">// ObjectBoxはデフォルトでidを必要とします。</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #4EC9B0">String</span><span style="color: #D4D4D4"> name;</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #4EC9B0">int</span><span style="color: #D4D4D4"> age;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #4EC9B0">User</span><span style="color: #D4D4D4">({</span><span style="color: #569CD6">this</span><span style="color: #D4D4D4">.id = </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">required</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">this</span><span style="color: #D4D4D4">.name, </span><span style="color: #569CD6">required</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">this</span><span style="color: #D4D4D4">.age});</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p>　次にObjectBoxを実行するために以下コマンドを実行します。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="flutter pub run build_runner build" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">flutter</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">pub</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">run</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">build_runner</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">build</span></span></code></pre></div>



<p>　実行すると、objectbox-model.jsonとobjectbox.g.dartが生成されたことを確認してください。</p>



<h2 class="wp-block-heading">4. ObjectBoxの初期化</h2>



<p>　ObjectBoxを初期化します。少し長いのでmain.dartをそのまま記載します。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="import 'package:flutter/material.dart';
import 'package:objectbox/objectbox.dart';
import 'package:objectbox_sample/objectbox.g.dart';
import 'package:path/path.dart' as p;
import 'package:path_provider/path_provider.dart';

late final ObjectBox box;
void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  // ObjectBoxの初期化
  box = await ObjectBox.create();

  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});
  final String title;

  @override
  State<MyHomePage&gt; createState() =&gt; _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage&gt; {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget&gt;[
            const Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headlineMedium,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: const Icon(Icons.add),
      ),
    );
  }
}

class ObjectBox {
  late final Store store;

  ObjectBox._create(this.store) {}

  static Future<ObjectBox&gt; create() async {
    final docsDir = await getApplicationDocumentsDirectory();
    final store = await openStore(directory: p.join(docsDir.path, &quot;obx-store&quot;));
    return ObjectBox._create(store);
  }
}
" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">import</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;package:flutter/material.dart&#39;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #569CD6">import</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;package:objectbox/objectbox.dart&#39;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #569CD6">import</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;package:objectbox_sample/objectbox.g.dart&#39;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #569CD6">import</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;package:path/path.dart&#39;</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">as</span><span style="color: #D4D4D4"> p;</span></span>
<span class="line"><span style="color: #569CD6">import</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;package:path_provider/path_provider.dart&#39;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">late</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">final</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">ObjectBox</span><span style="color: #D4D4D4"> box;</span></span>
<span class="line"><span style="color: #569CD6">void</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">main</span><span style="color: #D4D4D4">() </span><span style="color: #C586C0">async</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #4EC9B0">WidgetsFlutterBinding</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">ensureInitialized</span><span style="color: #D4D4D4">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">// ObjectBoxの初期化</span></span>
<span class="line"><span style="color: #D4D4D4">  box = </span><span style="color: #C586C0">await</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">ObjectBox</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">create</span><span style="color: #D4D4D4">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #DCDCAA">runApp</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">MyApp</span><span style="color: #D4D4D4">());</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">MyApp</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">extends</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">StatelessWidget</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">MyApp</span><span style="color: #D4D4D4">({</span><span style="color: #569CD6">super</span><span style="color: #D4D4D4">.key});</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #6A9955">// This widget is the root of your application.</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">@override</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #4EC9B0">Widget</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">build</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">BuildContext</span><span style="color: #D4D4D4"> context) {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">MaterialApp</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">      title: </span><span style="color: #CE9178">&#39;Flutter Demo&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">      theme: </span><span style="color: #4EC9B0">ThemeData</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">        colorScheme: </span><span style="color: #4EC9B0">ColorScheme</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">fromSeed</span><span style="color: #D4D4D4">(seedColor: </span><span style="color: #4EC9B0">Colors</span><span style="color: #D4D4D4">.deepPurple),</span></span>
<span class="line"><span style="color: #D4D4D4">        useMaterial3: </span><span style="color: #569CD6">true</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">      ),</span></span>
<span class="line"><span style="color: #D4D4D4">      home: </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">MyHomePage</span><span style="color: #D4D4D4">(title: </span><span style="color: #CE9178">&#39;Flutter Demo Home Page&#39;</span><span style="color: #D4D4D4">),</span></span>
<span class="line"><span style="color: #D4D4D4">    );</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">MyHomePage</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">extends</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">StatefulWidget</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">MyHomePage</span><span style="color: #D4D4D4">({</span><span style="color: #569CD6">super</span><span style="color: #D4D4D4">.key, </span><span style="color: #569CD6">required</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">this</span><span style="color: #D4D4D4">.title});</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">final</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">String</span><span style="color: #D4D4D4"> title;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">@override</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #4EC9B0">State</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">MyHomePage</span><span style="color: #D4D4D4">&gt; </span><span style="color: #DCDCAA">createState</span><span style="color: #D4D4D4">() =&gt; </span><span style="color: #4EC9B0">_MyHomePageState</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">_MyHomePageState</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">extends</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">State</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">MyHomePage</span><span style="color: #D4D4D4">&gt; {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #4EC9B0">int</span><span style="color: #D4D4D4"> _counter = </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">void</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">_incrementCounter</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">setState</span><span style="color: #D4D4D4">(() {</span></span>
<span class="line"><span style="color: #D4D4D4">      _counter++;</span></span>
<span class="line"><span style="color: #D4D4D4">    });</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">@override</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #4EC9B0">Widget</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">build</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">BuildContext</span><span style="color: #D4D4D4"> context) {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Scaffold</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">      appBar: </span><span style="color: #4EC9B0">AppBar</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">        backgroundColor: </span><span style="color: #4EC9B0">Theme</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">of</span><span style="color: #D4D4D4">(context).colorScheme.inversePrimary,</span></span>
<span class="line"><span style="color: #D4D4D4">        title: </span><span style="color: #4EC9B0">Text</span><span style="color: #D4D4D4">(widget.title),</span></span>
<span class="line"><span style="color: #D4D4D4">      ),</span></span>
<span class="line"><span style="color: #D4D4D4">      body: </span><span style="color: #4EC9B0">Center</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">        child: </span><span style="color: #4EC9B0">Column</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">          mainAxisAlignment: </span><span style="color: #4EC9B0">MainAxisAlignment</span><span style="color: #D4D4D4">.center,</span></span>
<span class="line"><span style="color: #D4D4D4">          children: &lt;</span><span style="color: #4EC9B0">Widget</span><span style="color: #D4D4D4">&gt;[</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Text</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">              </span><span style="color: #CE9178">&#39;You have pushed the button this many times:&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">            ),</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #4EC9B0">Text</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">              </span><span style="color: #CE9178">&#39;$</span><span style="color: #9CDCFE">_counter</span><span style="color: #CE9178">&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">              style: </span><span style="color: #4EC9B0">Theme</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">of</span><span style="color: #D4D4D4">(context).textTheme.headlineMedium,</span></span>
<span class="line"><span style="color: #D4D4D4">            ),</span></span>
<span class="line"><span style="color: #D4D4D4">          ],</span></span>
<span class="line"><span style="color: #D4D4D4">        ),</span></span>
<span class="line"><span style="color: #D4D4D4">      ),</span></span>
<span class="line"><span style="color: #D4D4D4">      floatingActionButton: </span><span style="color: #4EC9B0">FloatingActionButton</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">        onPressed: _incrementCounter,</span></span>
<span class="line"><span style="color: #D4D4D4">        tooltip: </span><span style="color: #CE9178">&#39;Increment&#39;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        child: </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Icon</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">Icons</span><span style="color: #D4D4D4">.add),</span></span>
<span class="line"><span style="color: #D4D4D4">      ),</span></span>
<span class="line"><span style="color: #D4D4D4">    );</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">ObjectBox</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">late</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">final</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Store</span><span style="color: #D4D4D4"> store;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #4EC9B0">ObjectBox</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">_create</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">this</span><span style="color: #D4D4D4">.store) {}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">static</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Future</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">ObjectBox</span><span style="color: #D4D4D4">&gt; </span><span style="color: #DCDCAA">create</span><span style="color: #D4D4D4">() </span><span style="color: #C586C0">async</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">final</span><span style="color: #D4D4D4"> docsDir = </span><span style="color: #C586C0">await</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">getApplicationDocumentsDirectory</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">final</span><span style="color: #D4D4D4"> store = </span><span style="color: #C586C0">await</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">openStore</span><span style="color: #D4D4D4">(directory: p.</span><span style="color: #DCDCAA">join</span><span style="color: #D4D4D4">(docsDir.path, </span><span style="color: #CE9178">&quot;obx-store&quot;</span><span style="color: #D4D4D4">));</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">ObjectBox</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">_create</span><span style="color: #D4D4D4">(store);</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span></code></pre></div>



<h2 class="wp-block-heading">5. データベースの操作</h2>



<p>　次にObjectBoxを使ってデータベースを操作してみます。今回はシンプルなCRUD処理を作成しました。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="// データの挿入
  void insertUser(User user) {
    final userBox = box.store.box<User&gt;();
    userBox.put(user);
  }

// データの読み出し
  User? getUser(int id) {
    final userBox = box.store.box<User&gt;();
    return userBox.get(id);
  }

// データの更新
  void updateUser(User user) {
    final userBox = box.store.box<User&gt;();
    user.name = 'Updated Name'; // 名前を更新
    userBox.put(user);
  }

// データの削除
  void deleteUser(int id) {
    final userBox = box.store.box<User&gt;();
    userBox.remove(id);
  }" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955">// データの挿入</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">void</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">insertUser</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">User</span><span style="color: #D4D4D4"> user) {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">final</span><span style="color: #D4D4D4"> userBox = box.store.</span><span style="color: #DCDCAA">box</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">User</span><span style="color: #D4D4D4">&gt;();</span></span>
<span class="line"><span style="color: #D4D4D4">    userBox.</span><span style="color: #DCDCAA">put</span><span style="color: #D4D4D4">(user);</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">// データの読み出し</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #4EC9B0">User</span><span style="color: #D4D4D4">? </span><span style="color: #DCDCAA">getUser</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">int</span><span style="color: #D4D4D4"> id) {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">final</span><span style="color: #D4D4D4"> userBox = box.store.</span><span style="color: #DCDCAA">box</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">User</span><span style="color: #D4D4D4">&gt;();</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> userBox.</span><span style="color: #DCDCAA">get</span><span style="color: #D4D4D4">(id);</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">// データの更新</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">void</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">updateUser</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">User</span><span style="color: #D4D4D4"> user) {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">final</span><span style="color: #D4D4D4"> userBox = box.store.</span><span style="color: #DCDCAA">box</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">User</span><span style="color: #D4D4D4">&gt;();</span></span>
<span class="line"><span style="color: #D4D4D4">    user.name = </span><span style="color: #CE9178">&#39;Updated Name&#39;</span><span style="color: #D4D4D4">; </span><span style="color: #6A9955">// 名前を更新</span></span>
<span class="line"><span style="color: #D4D4D4">    userBox.</span><span style="color: #DCDCAA">put</span><span style="color: #D4D4D4">(user);</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">// データの削除</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">void</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">deleteUser</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">int</span><span style="color: #D4D4D4"> id) {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">final</span><span style="color: #D4D4D4"> userBox = box.store.</span><span style="color: #DCDCAA">box</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">User</span><span style="color: #D4D4D4">&gt;();</span></span>
<span class="line"><span style="color: #D4D4D4">    userBox.</span><span style="color: #DCDCAA">remove</span><span style="color: #D4D4D4">(id);</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span></code></pre></div>



<p>　以上がObjectBoxの環境作成から操作までのコードになります。</p>



<h2 class="wp-block-heading">6. パフォーマンスと最適化</h2>



<p>　ObjectBoxを利用する上で簡単にパフォーマンスの最適化のヒントを記載します。実際のコードはプロジェクトの特性などを加味して設計してください。※一般的なDB技術と重複します。</p>



<ol class="wp-block-list">
<li><strong>インデックスの適用</strong>: 頻繁にアクセスする属性にインデックスを適用することで、検索速度が大幅に向上します。例えば、ユーザー名やIDのような属性にインデックスを設定すると効果的です。</li>



<li><strong>関連データの効率的な管理</strong>: エンティティ間の関係を適切に設計することで、データベースの構造を単純化し、関連データの取得コストを削減します。</li>



<li><strong>非同期処理の活用</strong>: ObjectBoxは非同期APIを提供しており、これを利用することで、重いデータ操作がアプリケーションの応答性を阻害することなくバックグラウンドで実行されます。</li>



<li><strong>トランザクションの最適化</strong>: ObjectBoxでは、複数の書き込み操作を一つのトランザクションでまとめて実行することで、オーバーヘッドを減らし、効率を向上させることができます。</li>
</ol>



<h2 class="wp-block-heading">8. まとめ</h2>



<p>　この記事では、Visual Studio Code (VSCode) を使って Flutter アプリケーションに ObjectBox データベースを統合する方法について詳しく説明しました。環境設定から始め、モデルの定義、データベースの初期化、CRUD操作までのステップバイステップのプロセスを解説し、パフォーマンスの最適化についても触れました。是非ObjectBoxを使ってみてください。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://techgrowup.net/flutter-objectbox/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Cannot lock checksums cache () as it has already been locked by this processが出たときの対処法</title>
		<link>https://techgrowup.net/cannot-lock-checksums-cache-as-it-has-already-been-locked-by-this-process%e3%81%8c%e5%87%ba%e3%81%9f%e3%81%a8%e3%81%8d%e3%81%ae%e5%af%be%e5%87%a6%e6%b3%95/</link>
					<comments>https://techgrowup.net/cannot-lock-checksums-cache-as-it-has-already-been-locked-by-this-process%e3%81%8c%e5%87%ba%e3%81%9f%e3%81%a8%e3%81%8d%e3%81%ae%e5%af%be%e5%87%a6%e6%b3%95/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[techgrowup]]></dc:creator>
		<pubDate>Mon, 11 Apr 2022 15:51:28 +0000</pubDate>
				<category><![CDATA[エラー集]]></category>
		<category><![CDATA[Androidアプリ開発]]></category>
		<category><![CDATA[エラー]]></category>
		<guid isPermaLink="false">https://techgrowup.net/?p=1520</guid>

					<description><![CDATA[原因 私の場合はAndriodアプリの開発をしているときに出てきましたが、gradleを使おうとすると既に他のプロセスに使われていてロックされている状態になります。何度もビルドしようとしても同じエラーが出てしまうため意図 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">原因</h2>



<p> 私の場合はAndriodアプリの開発をしているときに出てきましたが、gradleを使おうとすると既に他のプロセスに使われていてロックされている状態になります。何度もビルドしようとしても同じエラーが出てしまうため意図的にロックされているファイルを消す必要がありました。</p>



<p></p>



<h2 class="wp-block-heading">対処法</h2>



<p> 下記コマンドを叩けば一発で直りました。</p>



<pre class="wp-block-code"><code>find ~/.gradle -type f -name "*.lock" -delete</code></pre>
]]></content:encoded>
					
					<wfw:commentRss>https://techgrowup.net/cannot-lock-checksums-cache-as-it-has-already-been-locked-by-this-process%e3%81%8c%e5%87%ba%e3%81%9f%e3%81%a8%e3%81%8d%e3%81%ae%e5%af%be%e5%87%a6%e6%b3%95/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【Androidアプリ開発】JetpackライブラリMedia3で動画をローカル再生する</title>
		<link>https://techgrowup.net/android-jetpack-media3/</link>
					<comments>https://techgrowup.net/android-jetpack-media3/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[techgrowup]]></dc:creator>
		<pubDate>Mon, 03 Jan 2022 13:34:37 +0000</pubDate>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[Androidアプリ開発]]></category>
		<category><![CDATA[Jetpack]]></category>
		<category><![CDATA[Kotlin]]></category>
		<category><![CDATA[Media3]]></category>
		<guid isPermaLink="false">https://techgrowup.net/?p=1444</guid>

					<description><![CDATA[Media3について 　Media3はJetpackライブラリの１つで、2021年10月27日にバージョン1.0.0-alpha01が公開されています。主な用途としてはメディア（動画、配信）周りのサポートをしてくれるライ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">Media3について</h2>



<p>　<a rel="noopener" target="_blank" href="https://developer.android.com/jetpack/androidx/releases/media3">Media3<span class="fa fa-external-link external-icon anchor-icon"></span></a>はJetpackライブラリの１つで、2021年10月27日にバージョン1.0.0-alpha01が公開されています。主な用途としてはメディア（動画、配信）周りのサポートをしてくれるライブラリで、元々<a rel="noopener" target="_blank" href="https://github.com/google/ExoPlayer">ExoPlayer<span class="fa fa-external-link external-icon anchor-icon"></span></a>というAndroidで利用されているライブラリがありましたが、それを元に作成されたようです。<br>　現状はMedia3とExoPlayerは別のレポジトリとして開発が行われ、しばらくは並行して行っていくようですが、将来的にはMedia3に置き換わっていくように記載されていました。</p>



<h2 class="wp-block-heading">ローカルファイルの再生</h2>



<p>　今回はアプリ内にあるmp4ファイルを再生する簡単なアプリを作ってみます。Media3はExoPlayerと同様にメディアセッションの管理やDASH、HLSのサポートやエラー処理など幅広い機能がありますが、それらを実装するとソースコードが増えてしまいますので、最低限の実装を記載しつつ必要であればリファレンスなどを参考にしながら実装してみてください。</p>



<p>　まずライブラリをbuild.gradle(app)に足します。以下は最低限のみ記載していますが、他にも多くの<a rel="noopener" target="_blank" href="https://developer.android.com/jetpack/androidx/releases/media3#kts">ライブラリ<span class="fa fa-external-link external-icon anchor-icon"></span></a>がコンポーネントごとに作られていますので、必要そうなのは取ってきても大丈夫です！</p>



<pre class="wp-block-code"><code>    def media3_version = "1.0.0-alpha01"
    implementation "androidx.media3:media3-exoplayer:$media3_version"
    implementation "androidx.media3:media3-ui:$media3_version"
    implementation "androidx.media3:media3-session:$media3_version"
    implementation "androidx.media3:media3-test-utils:$media3_version"</code></pre>



<p>　続いて、xmlにはStyledPlayerViewというコンポーネントを配置しましょう。以前はPlayerViewというのが主流だったように記憶していますが、ここ数年は<meta charset="utf-8">StyledPlayerViewが主流なんですかね。間違っていたらすいません&#8230;</p>



<pre class="wp-block-code"><code>    &lt;androidx.media3.ui.StyledPlayerView
        android:id="@+id/player_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    &lt;/androidx.media3.ui.StyledPlayerView></code></pre>



<p>　最後にアクティビティのコードを記載します。特にこれといったことはしていませんが、createMediaItems関数で再生したいMediaItemのリストとして作成し、initializePlayer関数で作成しています。</p>



<pre class="wp-block-code"><code>class SamplePlayer : AppCompatActivity() {
    private lateinit var binding: ActivitySamplePlayerBinding

    private lateinit var mediaItems: MutableList&lt;MediaItem>
    private var player: ExoPlayer? = null
    private var trackSelectionParameters: DefaultTrackSelector.Parameters? = null
    private lateinit var trackSelector: DefaultTrackSelector

    private var startAutoPlay: Boolean = false
    private var startItemIndex: Int = 0
    private var startPosition: Long = 0L

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivitySamplePlayerBinding.inflate(layoutInflater)
        val view = binding.root
        setContentView(view)

        binding.playerView.requestFocus()

        trackSelectionParameters =
            DefaultTrackSelector.ParametersBuilder( /* context= */this).build()
        clearStartPosition()
    }

    override fun onStart() {
        super.onStart()
        if (Util.SDK_INT > 23) {
            initializePlayer()
            binding.playerView.onResume()
        }
    }

    private fun initializePlayer() {
        if (player == null) {
            mediaItems = createMediaItems()
            trackSelector = DefaultTrackSelector(this)
            player = ExoPlayer.Builder(this)
                .setTrackSelector(trackSelector)
                .build()

            player?.trackSelectionParameters = trackSelectionParameters!!
            player?.setAudioAttributes(AudioAttributes.DEFAULT, true)
            player?.playWhenReady = startAutoPlay
            binding.playerView.player = player
        }

        val haveStartPosition = startItemIndex != C.INDEX_UNSET
        if (haveStartPosition) {
            player?.seekTo(startItemIndex, startPosition)
        }
        player?.setMediaItems(mediaItems, !haveStartPosition)
        player?.prepare()
    }

    private fun createMediaItems(): MutableList&lt;MediaItem> {
        val mediaItems = mutableListOf&lt;MediaItem>()

        val rawDataSource = RawResourceDataSource(this)
        rawDataSource.open(DataSpec(RawResourceDataSource.buildRawResourceUri(R.raw.&lt;ここにmp4ファイル名>)))
        mediaItems.add(
            MediaItem.fromUri(rawDataSource.uri!!)
        )
        return mediaItems
    }

    private fun clearStartPosition() {
        startAutoPlay = true
        startItemIndex = C.INDEX_UNSET
        startPosition = C.TIME_UNSET
    }
}</code></pre>
]]></content:encoded>
					
					<wfw:commentRss>https://techgrowup.net/android-jetpack-media3/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>moshi 1.9.0以上を使う場合に、Cannot serialize Kotlin typeが出たときの対処法</title>
		<link>https://techgrowup.net/moshi-1-9-0/</link>
					<comments>https://techgrowup.net/moshi-1-9-0/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[techgrowup]]></dc:creator>
		<pubDate>Tue, 16 Nov 2021 14:25:43 +0000</pubDate>
				<category><![CDATA[エラー集]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[Androidアプリ開発]]></category>
		<category><![CDATA[Kotlin]]></category>
		<guid isPermaLink="false">https://techgrowup.net/?p=1387</guid>

					<description><![CDATA[　私がmoshi 1.9.0を使おうとすると下記のようなエラーが出てきました。(xxxxxはパッケージ名とクラス) 　これはmoshi 1.9.0からはkotlin-reflectまたはmoshi-kotlin-code [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>　私がmoshi 1.9.0を使おうとすると下記のようなエラーが出てきました。(xxxxxはパッケージ名とクラス)</p>



<div class="wp-block-cocoon-blocks-blank-box-1 blank-box block-box">
<p>Cannot serialize Kotlin type xxxxxx. Reflective serialization of Kotlin classes without using kotlin-reflect has undefined and unexpected behavior. Please use KotlinJsonAdapter from the moshi-kotlin artifact or use code gen from the moshi-kotlin-codegen artifact.</p>
</div>



<p>　これはmoshi 1.9.0からはkotlin-reflectまたはmoshi-kotlin-codegenを全てのKotlinクラスに利用する必要があるからとのことですので、下記の対処法の<span class="bold-red">どちらか</span>を行いましょう</p>





<a rel="noopener" target="_blank" href="https://github.com/square/moshi/blob/master/CHANGELOG.md#version-190" title="moshi/CHANGELOG.md at master · square/moshi" class="blogcard-wrap external-blogcard-wrap a-wrap cf"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img decoding="async" src="https://opengraph.githubassets.com/8ccf3cccaf55fc300be98d8b75054a18c1423a165ada0d4a47084049e43169e6/square/moshi" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">moshi/CHANGELOG.md at master · square/moshi</div><div class="blogcard-snippet external-blogcard-snippet">A modern JSON library for Kotlin and Java. Contribute to square/moshi development by creating an account on GitHub.</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://github.com/square/moshi/blob/master/CHANGELOG.md" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">github.com</div></div></div></div></a>




<h3 class="wp-block-heading">KotlinJsonAdapterFactoryを利用する</h3>



<p>　Moshiのインスタンスを作成するときに、下記のように.add()を追加して、Kotlin用のアダプターを追加しましょう。</p>



<pre class="wp-block-code"><code>Moshi.Builder()
    .add(KotlinJsonAdapterFactory())
    .build()</code></pre>



<p></p>



<h3 class="wp-block-heading">codegenアノテーションプロセッサを利用する</h3>



<p>　data classなどに下記のアノテーションを追加しましょう。</p>



<pre class="wp-block-code"><code>@JsonClass(generateAdapter = true)
data class Sample(
        val hoge: Hoge,
        val fuga: Fuga
)</code></pre>



<h3 class="wp-block-heading">余談</h3>



<p>　1.9.0以上の変更については、以前はMoshiはKotlinとjavaを区別していなかったようなのですが、nullをNonNullのフィールドに入れてしまうなどの悪影響が大きかったため、このような修正に至ったようです。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://techgrowup.net/moshi-1-9-0/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【Androidアプリ開発】Intentとは、Intentの使い方とは。</title>
		<link>https://techgrowup.net/android-intent/</link>
					<comments>https://techgrowup.net/android-intent/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[techgrowup]]></dc:creator>
		<pubDate>Mon, 17 May 2021 15:10:36 +0000</pubDate>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[Androidアプリ開発]]></category>
		<category><![CDATA[Intent]]></category>
		<guid isPermaLink="false">https://techgrowth.xsrv.jp/wp/?p=89</guid>

					<description><![CDATA[はじめに 　本記事ではAndroidアプリ開発における、Intentとはという点について概要から、実際のIntentの使い方例を交えて解説していきたいと思います。 Intentとは 　インテントとは、「何かを行う意図」と [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h1 class="wp-block-heading">はじめに</h1>



<p>　本記事ではAndroidアプリ開発における、Intentとはという点について概要から、実際のIntentの使い方例を交えて解説していきたいと思います。</p>



<p></p>



<h2 class="wp-block-heading">Intentとは</h2>



<p> 　<a rel="noopener" target="_blank" href="https://developer.android.com/guide/components/intents-common?hl=ja">インテント<span class="fa fa-external-link external-icon anchor-icon"></span></a>とは、「何かを行う意図」という意味で、幅広い役割として利用可能ですが、<span class="marker-under">特定のアクションをリクエストする時に使用できる、メッセージングオブジェクトのこと</span>を意味しています。例えば別の画面を開きたい時に、AndroidではActivity単位で画面が作られますが、<span class="marker-under">「開いている画面に対して別の画面を開いてください」とアプリにメッセージとして伝えることで、別の画面を開くことが可能</span>になります。<br>　今回は基本的な使い方として、「Activityを起動する」、「Serviceを起動する」、「ブロードキャストを配信する」の3点をIntentを使った例として紹介します。</p>



<h3 class="wp-block-heading">Activityを起動する</h3>



<p>　まずActivityを起動する例について、Activityについて詳しく知りたい方は下記記事をご覧ください。</p>



<figure class="wp-block-embed is-type-wp-embed is-provider-techgrowup wp-block-embed-techgrowup"><div class="wp-block-embed__wrapper">

<a target="_self" href="https://techgrowup.net/android-activity-lifecycle" title="【Androidアプリ開発】アクティビティとライフサイクルの重要性" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="160" height="90" src="https://techgrowup.net/wp-content/uploads/2021/05/activity-lifecycle-icatch-160x90.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://techgrowup.net/wp-content/uploads/2021/05/activity-lifecycle-icatch-160x90.png 160w, https://techgrowup.net/wp-content/uploads/2021/05/activity-lifecycle-icatch-120x68.png 120w, https://techgrowup.net/wp-content/uploads/2021/05/activity-lifecycle-icatch-320x180.png 320w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【Androidアプリ開発】アクティビティとライフサイクルの重要性</div><div class="blogcard-snippet internal-blogcard-snippet">Androidアプリ開発におけるActivityとライフサイクルの概念を説明しています。Androidアプリ開発ではライフサイクルを意識することで、高品質なアプリを作ることが出来ますので、必ず学んでください。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://techgrowup.net" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">techgrowup.net</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2024.10.29</div></div></div></div></a>
</div></figure>



<p>　簡単にActivityについて説明しておくと、Activityはアプリにおいて1つの画面を表しています。Activityがあることでユーザーは画面を用いて、何かしらのボタンを押すことが出来たり、処理を行うことが出来るのです。<br>　<span class="marker-under">Intentを用いることで、別のActivityを開始することが出来ます</span>。下記の例は、MainActvitiyからSampleActivityに遷移させる時のコード例です。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="val intent:Intent = Intent(this,SampleActivity().javaClass)
startActivity(intent)" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">val</span><span style="color: #D4D4D4"> intent:</span><span style="color: #4EC9B0">Intent</span><span style="color: #D4D4D4"> = </span><span style="color: #DCDCAA">Intent</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">this</span><span style="color: #D4D4D4">,</span><span style="color: #DCDCAA">SampleActivity</span><span style="color: #D4D4D4">().javaClass)</span></span>
<span class="line"><span style="color: #DCDCAA">startActivity</span><span style="color: #D4D4D4">(intent)</span></span></code></pre></div>



<p>　Intent(this,SampleActivity().javaclass))というのがIntentのメッセージの内容を示しており、thisはMainActivityの事なので、<span class="marker-under">Intentには「MainActivityからSampleActivityを開く」</span>という意味が込められていることになります。<br>　そしてstartActivityという関数にintentを受け渡すことで、処理が行われます。</p>



<p>　また、上記の例でSampleActivityから何かしらの結果を受け取りたい場合は、<a rel="noopener" target="_blank" href="https://developer.android.com/reference/android/app/Activity?hl=ja#startActivityForResult(android.content.Intent,%20int)">startActivityForResult()<span class="fa fa-external-link external-icon anchor-icon"></span></a>という関数を呼び出すことで、<span class="marker-under">MainActivityでSampleActivityの結果を受け取ることができます</span>。こちらについては最初に下記のようにAcitivtyを開始させます。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="startActivityForResult(intent,1)" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">startActivityForResult</span><span style="color: #D4D4D4">(intent,</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">)</span></span></code></pre></div>



<p>　1というのはREQUEST_CODEなので、Int型であれば何でも大丈夫です。<br>その後、<span class="marker-under">MainActivityに画面が戻った時に、onActivityResultというコールバック関数でデータなどを受け取ることが可能</span>です。<br>　Intentにデータを含める方法は後述します。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
	super.onActivityResult(requestCode, resultCode, data)
}" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">override</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">fun</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">onActivityResult</span><span style="color: #D4D4D4">(requestCode: </span><span style="color: #4EC9B0">Int</span><span style="color: #D4D4D4">, resultCode: </span><span style="color: #4EC9B0">Int</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">data</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">Intent</span><span style="color: #D4D4D4">?) {</span></span>
<span class="line"><span style="color: #D4D4D4">	</span><span style="color: #569CD6">super</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">onActivityResult</span><span style="color: #D4D4D4">(requestCode, resultCode, </span><span style="color: #569CD6">data</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p></p>



<h3 class="wp-block-heading">Serviceを起動する</h3>



<p>　続いて、Intentを使ったServiceについてですが、<span class="marker-under">Serviceとは「ユーザーインターフェースを持たず、バックグラウンドで操作を実行するコンポーネント」を表しています</span>。例えば音楽アプリの場合だと、音楽をバックグラウンドでも再生したいという際などに、Serivceを用いて可能にします。<br>　Serivceを起動するにはIntentを利用する必要があり、SampleServiceというServiceを継承させたクラスの場合には、下記のように実行します。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="val intent:Intent = Intent(this,SampleService().javaClass)
startService(intent)" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">val</span><span style="color: #D4D4D4"> intent:</span><span style="color: #4EC9B0">Intent</span><span style="color: #D4D4D4"> = </span><span style="color: #DCDCAA">Intent</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">this</span><span style="color: #D4D4D4">,</span><span style="color: #DCDCAA">SampleService</span><span style="color: #D4D4D4">().javaClass)</span></span>
<span class="line"><span style="color: #DCDCAA">startService</span><span style="color: #D4D4D4">(intent)</span></span></code></pre></div>



<p>　使い方としては、Activityとほぼ同じになります。また、<span class="marker-under">Android 5.0(APIレベル21)以降では、サービスを開始するためにJobSchedulerを利用することができます。JobSchedulerの場合には、通常Intentを使わないで利用されます</span>ので、こちらについては別記事で説明します。</p>



<h3 class="wp-block-heading">ブロードキャストを配信する</h3>



<p>　最後にブロードキャスト配信についてです。ブロードキャストという言葉にはネットワークを学んだことがある方であれば馴染み深いと思いますが、<span class="marker-under">「全員に送る」というような意</span>味が込められています。すなわち、Androidアプリ開発におけるブロードキャストとは、全アプリに対して送ることが出来るメッセージを意味します。<br>　下記がコード例ですが、Intentを用いてIntentに内容を詰め込み、sendBroadcastで送信することが出来ます。受け取るときはBroadcastReceiverというクラスを用いて、実際のデータを受け取ります。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="Intent().also { intent -&gt;
	intent.setAction(&quot;com.example.intentapplication.broadcast.MY_NOTIFICATION&quot;)
	intent.putExtra(&quot;data&quot;, &quot;通知だよ！&quot;)
	sendBroadcast(intent)
}" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">Intent</span><span style="color: #D4D4D4">().</span><span style="color: #DCDCAA">also</span><span style="color: #D4D4D4"> { intent </span><span style="color: #569CD6">-&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">	intent.</span><span style="color: #DCDCAA">setAction</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;com.example.intentapplication.broadcast.MY_NOTIFICATION&quot;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">	intent.</span><span style="color: #DCDCAA">putExtra</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;data&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&quot;通知だよ！&quot;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">	</span><span style="color: #DCDCAA">sendBroadcast</span><span style="color: #D4D4D4">(intent)</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p></p>



<p></p>



<h2 class="wp-block-heading">インテントタイプについて</h2>



<p>　インテントには2種類のタイプが存在します。インテントは何かしらのメッセージをリクエストするものというのは冒頭に説明しましたが、例えば「メールアプリを開く」という場合や、「マップアプリを開く」という動作を行いたい場合に、<span class="marker-under">暗黙的インテントを利用することでユーザーに利用するアプリを選択させることが出来ます。</span><br>　ここでは2種類のタイプの、「明示的インテント」と「暗黙的インテント」について説明します。</p>



<h3 class="wp-block-heading">明示的インテント</h3>



<p>　明示的インテントとは、<span class="marker-under">特定のアプリを指定した上で処理を実行させるパターン</span>です。例えば「Activityを起動する」という項目がありましたが、こちらはMainActivity、すなわち自分自身のアプリのMainActivityに対して、自分自身のSampleActivityという画面を遷移させるコード例を見せましたが、これが<span class="marker-under">明示的にアプリを指定して動作させている</span>ということになります。</p>



<p></p>



<h3 class="wp-block-heading">暗黙的インテント</h3>



<p>　一方で暗黙的インテントでは、特定のアプリを指定するのではなく、<span class="marker-under">OSに対して「地図を表示したい」というリクエストをインテントを通して伝えてあげる</span>ことで、端末上で利用できるアプリを探し出し、選択できるようにすることができます。<br>　下記の例では、いくつかのマップアプリをインストールした状態で、「地図を表示したい」という暗黙的インテントを発行した際に、表示されるものになります。<span class="marker-under">OSがマップアプリと認識しているアプリに対して、ユーザーにどれを選ぶか選択させるような画面が表示されます</span>。</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="688" height="520" src="https://techgrowup.net/wp-content/uploads/2021/05/暗黙的インテント.png" alt="暗黙的インテントの表示" class="wp-image-637" srcset="https://techgrowup.net/wp-content/uploads/2021/05/暗黙的インテント.png 688w, https://techgrowup.net/wp-content/uploads/2021/05/暗黙的インテント-300x227.png 300w" sizes="(max-width: 688px) 100vw, 688px" /><figcaption class="wp-element-caption">暗黙的インテント</figcaption></figure>



<p></p>



<p></p>



<h2 class="wp-block-heading">インテントを使ってデータを渡す</h2>



<p>　最後にインテントを使って、何かしらのデータを送りたい時に、どんなデータが渡せることができ、どうやって渡すのかを説明したいと思います。</p>



<h3 class="wp-block-heading">アクション</h3>



<p>　まず1つ目ですが、<span class="marker-under">アクションというのは実行する「表示」や「選択」などのアクションを指定する文字列</span>になります。これを利用することで、受け取る側はどんなアクションが来たかを判別できるようになります。<br>　インテントに含める際には、下記のように記述します。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="intent.setAction(Intent.ACTION_VIEW)" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">intent.</span><span style="color: #DCDCAA">setAction</span><span style="color: #D4D4D4">(Intent.ACTION_VIEW)</span></span></code></pre></div>



<p>　上記例ではACTION_VIEWというのを定義しており、ACTION_VIEWは「表示」という意味を表していて、マップアプリで住所を表示するときなどに利用されます。<br>　またACTION_SENDというのは共有できるデータが有る場合になどに利用されます。例えばメールアプリを開くときなどに、相手のメアド情報のデータなどが該当します。<br>　その他にもアクションはIntentクラス内で多数定義されていますので、確認してみてください。</p>




<a rel="noopener" target="_blank" href="https://developer.android.com/reference/android/content/Intent?hl=ja" title="Intent  |  API reference  |  Android Developers" class="blogcard-wrap external-blogcard-wrap a-wrap cf"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://s.wordpress.com/mshots/v1/https%3A%2F%2Fdeveloper.android.com%2Freference%2Fandroid%2Fcontent%2FIntent%3Fhl%3Dja?w=160&#038;h=90" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">Intent  |  API reference  |  Android Developers</div><div class="blogcard-snippet external-blogcard-snippet"></div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://developer.android.com/reference/android/content/Intent" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">developer.android.com</div></div></div></div></a>



<h3 class="wp-block-heading">データ</h3>



<p>　次にデータですが、こちらは何となく色んなデータを入れると思いがちですが、実際には<span class="marker-under">Uriオブジェクトを代入</span>します。例えばWebviewを使ってインターネットのサイトを開きたい場合、urlが必ず必要になりますので、このような場合にはインテントにurlを下記のように入れます。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="intent.setData(Uri.parse(&quot;https://techgrowup.net&quot;))" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">intent.</span><span style="color: #DCDCAA">setData</span><span style="color: #D4D4D4">(Uri.</span><span style="color: #DCDCAA">parse</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;https://techgrowup.net&quot;</span><span style="color: #D4D4D4">))</span></span></code></pre></div>



<p>　またUriとして<span class="marker-under">画像データなどを送る際には、オーディオファイルなどとは区別しなければならないので、MIMEタイプを指定することになります</span>。MIMEタイプはsetTypeで呼び出すことができ、下記のように指定します。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="intent.setData(Uri.parse(&quot;file:///sdcard/sample.jpg&quot;))
intent.setType(&quot;image/jpeg&quot;)" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">intent.</span><span style="color: #DCDCAA">setData</span><span style="color: #D4D4D4">(Uri.</span><span style="color: #DCDCAA">parse</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;file:///sdcard/sample.jpg&quot;</span><span style="color: #D4D4D4">))</span></span>
<span class="line"><span style="color: #D4D4D4">intent.</span><span style="color: #DCDCAA">setType</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;image/jpeg&quot;</span><span style="color: #D4D4D4">)</span></span></code></pre></div>



<p></p>



<h3 class="wp-block-heading">カテゴリ</h3>



<p>　続いてカテゴリですが、こちらは<span class="marker-under">コンポーネントの種類に対する追加情報を含めるためのもの</span>です。よく使われるカテゴリだと、CATEGORY_BROWSABLEやCATEGORY_LAUNCHERなどがあります。例えば下記の例だと、遷移先のActivityは、ウェブブラウザから開始してリンクで参照されているデータを表示することが出来ます。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="intent.addCategory(Intent.CATEGORY_BROWSABLE)" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">intent.</span><span style="color: #DCDCAA">addCategory</span><span style="color: #D4D4D4">(Intent.CATEGORY_BROWSABLE)</span></span></code></pre></div>



<p>　カテゴリもIntentクラス内に多数のカテゴリが定義されていますので、興味がある方は見てみてください。</p>




<a rel="noopener" target="_blank" href="https://developer.android.com/reference/android/content/Intent?hl=ja" title="Intent  |  API reference  |  Android Developers" class="blogcard-wrap external-blogcard-wrap a-wrap cf"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://s.wordpress.com/mshots/v1/https%3A%2F%2Fdeveloper.android.com%2Freference%2Fandroid%2Fcontent%2FIntent%3Fhl%3Dja?w=160&#038;h=90" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">Intent  |  API reference  |  Android Developers</div><div class="blogcard-snippet external-blogcard-snippet"></div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://developer.android.com/reference/android/content/Intent" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">developer.android.com</div></div></div></div></a>



<h3 class="wp-block-heading">エクストラ</h3>



<p>　続いてエクストラについてですが、こちらは<span class="marker-under">キーバリュ型で様々データを含めることが可能</span>です。例えば遷移先のActivtiyに5という数値を渡したい場合には、下記のように渡します。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="intent.putExtra(&quot;NUMBER&quot;,5)" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">intent.</span><span style="color: #DCDCAA">putExtra</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;NUMBER&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #B5CEA8">5</span><span style="color: #D4D4D4">)</span></span></code></pre></div>



<p>　NUMBERというのはキーのことで、このキーを元に遷移先のActivityで受け取るときは下記のようにして受け取ることが出来ます。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="getIntent().getIntExtra(&quot;NUMBER&quot;,0)" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">getIntent</span><span style="color: #D4D4D4">().</span><span style="color: #DCDCAA">getIntExtra</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;NUMBER&quot;</span><span style="color: #D4D4D4">,</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">)</span></span></code></pre></div>



<p>　第2引数の0というのはデフォルト値のことで、NUMBERというキーが存在しなかった場合は0を返すという処理になります。</p>



<p>　<span class="marker-under">その他にも、文字列や浮動小数点、論理型など様々なデータを含めることが可能</span>です。</p>



<h3 class="wp-block-heading">フラグ</h3>



<p>　最後がフラグになります。<span class="marker-under">フラグはインテントのメタデータとして機能</span>させることが出来るもので、こちらもIntentクラス内に多数の定義があります。例えば下記の例だと、Activityを新しいタスクとして定義することができるメタデータになります。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">intent.</span><span style="color: #DCDCAA">setFlags</span><span style="color: #D4D4D4">(Intent.FLAG_ACTIVITY_NEW_TASK)</span></span></code></pre></div>



<p></p>



<h2 class="wp-block-heading">まとめ</h2>



<p>　今回はAndroidアプリ開発におけるIntentの概要から、実際の使い方を説明しました。またデータを送る際のコードと、受け取る時のコードなどを解説しました。<br>　Intentはアプリ開発では画面遷移時やServiceを使うときなどに必ず使うものですので、ぜひ覚えておきましょう。</p>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://techgrowup.net/android-intent/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【Androidアプリ開発】パーミッション(権限)の概要と一覧</title>
		<link>https://techgrowup.net/permission/</link>
					<comments>https://techgrowup.net/permission/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[techgrowup]]></dc:creator>
		<pubDate>Fri, 14 May 2021 13:20:20 +0000</pubDate>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[Androidアプリ開発]]></category>
		<category><![CDATA[permission]]></category>
		<category><![CDATA[パーミッション]]></category>
		<category><![CDATA[権限]]></category>
		<guid isPermaLink="false">https://techgrowup.net/?p=571</guid>

					<description><![CDATA[はじめに 　本記事ではAndroidアプリ開発における、パーミッション(権限）についての説明と一覧を紹介したいと思います。 パーミッション(権限)とは 　Androidアプリ開発における、パーミッション（権限）とは、アプ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h1 class="wp-block-heading">はじめに</h1>



<p>　本記事ではAndroidアプリ開発における、パーミッション(権限）についての説明と一覧を紹介したいと思います。</p>



<p></p>



<h2 class="wp-block-heading">パーミッション(権限)とは</h2>



<p>　Androidアプリ開発における、パーミッション（権限）とは、<span class="marker-under">アプリを利用するユーザーを保護するために、特定の機能に対してアクセス保護を行うためのもの</span>です。例えば、ユーザーの連絡先情報やカメラやBluetoothなど該当します。これらをユーザーの許可なしに勝手にアプリが利用してはプライバシーに影響が出ると同時に、犯罪に繋がる恐れがあります。以下パーミッションを権限と呼びます。</p>



<p><br>　Android 6.0まではGoogle Playのインストール時に、取得したい権限を表示すればよかったのですが、Android 6.0以降は特定の権限に関しては、アプリ内で同意を取る必要があります。皆さんも下記画面は見たことがあるのではないでしょうか。<span class="marker-under">こちらが同意されると、アプリに対して権限が付与される</span>という仕組みになります。</p>



<figure class="wp-block-image aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="925" height="902" src="https://techgrowup.net/wp-content/uploads/2021/05/runtime-permission.png" alt="ランタイムパーミッションの画面" class="wp-image-582" style="aspect-ratio:463/451" srcset="https://techgrowup.net/wp-content/uploads/2021/05/runtime-permission.png 925w, https://techgrowup.net/wp-content/uploads/2021/05/runtime-permission-300x293.png 300w, https://techgrowup.net/wp-content/uploads/2021/05/runtime-permission-768x749.png 768w" sizes="(max-width: 925px) 100vw, 925px" /><figcaption class="wp-element-caption">権限同意画面</figcaption></figure>



<p>　また、<span class="marker-under">権限は好き放題つけていいわけではなく、使うものだけ</span>にしましょう。例えば位置情報を利用しないアプリなのに、位置情報の権限をしてはいけません。セキュリティの面やユーザーを守るためにも必要な権限のみをつけましょう。</p>



<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box alert-box">
<p>必要な権限のみ取得するようにしよう！</p>
</div>



<h2 class="wp-block-heading">パーミッション(権限）の使い方</h2>



<p>　続いて、権限を実際にどうやって使っていくのかを説明します。まず記載する場所ですが、AndroidManifest.xmlに記載していきます。下記がAndroidManifest.xmlの画面ですが、<br>&lt;<span class="marker-under">uses-permission&gt;</span>というタグが見えるかと思います。こちらを利用して権限の宣言をしていきます。また、その他にも設定できるオプションがありますので、合わせて説明します。</p>



<figure class="wp-block-image size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="357" src="https://techgrowup.net/wp-content/uploads/2021/05/androidmanifest-permission-1024x357.png" alt="AndroidManifestのパーミッション宣言" class="wp-image-583" style="aspect-ratio:840/292" srcset="https://techgrowup.net/wp-content/uploads/2021/05/androidmanifest-permission-1024x357.png 1024w, https://techgrowup.net/wp-content/uploads/2021/05/androidmanifest-permission-300x105.png 300w, https://techgrowup.net/wp-content/uploads/2021/05/androidmanifest-permission-768x268.png 768w, https://techgrowup.net/wp-content/uploads/2021/05/androidmanifest-permission.png 1106w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">AndroidManifest.xmlのパーミッション宣言</figcaption></figure>



<h3 class="wp-block-heading">&lt;uses-permission&gt;</h3>



<p>　まず先ほども紹介した、&lt;uses-permission&gt;タグについてです。こちらは利用したい権限を宣言することで、アプリに該当の権限を付与できるタグです。例えばインターネットを利用する場合は、以下のように宣言します。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="<uses-permission android:name=&quot;android.permission.INTERNET&quot; /&gt;" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #808080">&lt;</span><span style="color: #569CD6">uses-permission</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">android:name</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;android.permission.INTERNET&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #808080">/&gt;</span></span></code></pre></div>



<p>　また、外部ストレージに書き込み権限を付与するためには以下のように記載します。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code=" <uses-permission android:name=&quot;android.permission.WRITE_EXTERNAL_STORAGE&quot;/&gt;" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4"> </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">uses-permission</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">android:name</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;android.permission.WRITE_EXTERNAL_STORAGE&quot;</span><span style="color: #808080">/&gt;</span></span></code></pre></div>



<p>　見てみるとおわかりになると思いますが、INTERNETというキーワードと、WRITE_EXTERNAL_STORAGEの名前が違うだけですよね。これが該当の権限のキーワードということになります。</p>



<h3 class="wp-block-heading">&lt;uses-feature&gt;</h3>



<p>　続いて、&lt;uses-feature&gt;タグについてです。こちらはハードウェアやソフトウェアの機能要件を満たさない端末からアプリをフィルタします。例えば、Bluetoothを利用するアプリが、Bluetoothが搭載されていない端末（最近はあまりありませんが）に対してダウンロードされても利用することが出来ませんので、このような場合、<span class="marker-under">Google Playの配信端末から排除することが出来ます</span>。</p>



<p>　具体的に利用する場合は、下記のようにAndroidManifest.xmlに記述します。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="<uses-feature android:name=&quot;android.hardware.bluetooth&quot; /&gt;" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #808080">&lt;</span><span style="color: #569CD6">uses-feature</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">android:name</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;android.hardware.bluetooth&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #808080">/&gt;</span></span></code></pre></div>



<p></p>



<h2 class="wp-block-heading">保護レベル</h2>



<p>　権限には保護レベルという考え方が存在します。保護レベルとは各権限に対してGoogleが危険性を判断し、定義づけているものです。具体的には各権限は<span class="marker-under">&#8220;normal&#8221; , &#8220;dangerous&#8221;, &#8220;signature&#8221;,</span> に振り分けられています。それぞれについて説明します。<br>　※signatureOrSystemというレベルもありますが、今回は省きます。</p>



<h3 class="wp-block-heading">normal </h3>



<p>　normalとはその名の通り、<span class="marker-under">低リスクとみなされている権限</span>につけられています。これが付けられている権限はユーザに対して同意を取得する必要はなく、<span class="marker-under">インストール時に表示しておくだけで、アプリは権限を取得することが可能になります</span>。<br>　例えばACCESS_NETWORK_STATEという権限は、アプリケーションがネットワークの状態を取得するための権限になりますが、これを取得されてもユーザーは大きなリスクを追わないため、normalとなります。</p>



<h3 class="wp-block-heading">dangerous</h3>



<p>　dangerousとは、危険という意味ですが、こちらは<span class="marker-under">該当権限を利用するとユーザーに悪影響があると考えられる権限</span>に対して付けられています。例えば、CAMERAという権限はアプリがカメラにアクセスできるようになる権限ですが、カメラ機能はユーザーのプライバシーに大きな影響を与えるものになるため、<span class="marker-under">ユーザーの同意がなければ利用しようしてはいけないと</span>考えれられ、dangerousに指定されています。</p>



<p></p>



<h3 class="wp-block-heading">signature</h3>



<p>　signatureは通常の権限ではなく、シ<span class="marker-under">ステム権限と呼ばれる端末を製造しているメーカーが作成した権限で特定の機能を利用できるようにした権限</span>です。例えばDELETE_PACKAGESという、他のアプリを消すことができる権限は、かなり強力ですよね。この権限を持ったアプリが、他のアプリを勝手に削除してしまっては大変なことになるので、signatureが付けられています。<br>　基本的には端末を製造しているメーカーが作るアプリなどに、特定の機能が必要な場合のみメーカー署名が使われて、権限が使われることや、ルート化されている端末に対しては利用することが可能になります。（一般に売られている端末はルート化されていませんが、脱獄という方法が使える場合があります）<br></p>



<h2 class="wp-block-heading">パーミッション(権限）一覧</h2>



<p>　続いて、権限はたくさんありますので、覚えられない方も多くいると思います（私もあまりお覚えていません）。ここに主要な権限の一覧を記載しておきますので、お気に入りなどに入れ必要な時に見て頂ければと思います。</p>



<figure class="wp-block-table aligncenter"><div class="scrollable-table"><table><thead><tr><th>パーミッション</th><th>保護レベル</th><th>説明</th></tr></thead><tbody><tr><td>ACCESS_NETWORK_STATE</td><td>normal</td><td>アプリケーションがネットワークに関する情報にアクセスできるようにします。</td></tr><tr><td>ACCESS_WIFI_STATE</td><td>normal</td><td>アプリケーションがWi-Fiネットワークの情報にアクセスできるようにします。</td></tr><tr><td>BLUETOOTH</td><td>normal</td><td>アプリケーションとペアリングされたBluetooth機器との接続を可能にします。</td></tr><tr><td>CHANGE_NETWORK_STATE</td><td>normal</td><td>アプリケーションがネットワークの接続状態を変更できるようにします。</td></tr><tr><td>CHANGE_WIFI_STATE</td><td>normal</td><td>アプリケーションによるWi-Fi接続状態の変更を可能にします。</td></tr><tr><td>FOREGROUND_SERVICE</td><td>normal</td><td>通常のアプリケーションがService.startForegroundを使用できるようにします。</td></tr><tr><td>INTERNET</td><td>normal</td><td>アプリケーションがネットワークソケットを開くことを可能にします。</td></tr><tr><td>KILL_BACKGROUND_PROCESSES</td><td>normal</td><td>アプリケーションがActivityManager.killBackgroundProcesses(String)を<br>呼び出せるようにします。</td></tr><tr><td>MODIFY_AUDIO_SETTINGS</td><td>normal</td><td>アプリケーションがグローバルなオーディオ設定を変更することができます。</td></tr><tr><td>NFC</td><td>normal</td><td>アプリケーションがNFC上でI/O操作を行うことができます。</td></tr><tr><td>NFC_PREFERRED_PAYMENT_INFO</td><td>normal</td><td>アプリケーションがNFC優先決済サービス情報を受信できるようにします。</td></tr><tr><td>NFC_TRANSACTION_EVENT</td><td>normal</td><td>アプリケーションがNFCトランザクションイベントを受信できるようにします。</td></tr><tr><td>QUERY_ALL_PACKAGES</td><td>normal</td><td>マニフェストの宣言に関係なく、デバイス上の通常のアプリの問い合わせを可能にします。</td></tr><tr><td>SET_ALARM</td><td>normal</td><td>アプリケーションが、ユーザーにアラームを設定するIntentを<br>ブロードキャストすることができます。</td></tr><tr><td>TRANSMIT_IR</td><td>normal</td><td>デバイスのIRトランスミッターがある場合は、それを使用できます。</td></tr><tr><td>USE_BIOMETRIC</td><td>normal</td><td>デバイスがサポートするバイオメトリックモダリティをアプリで使用できるようにします。</td></tr><tr><td>VIBRATE</td><td>normal</td><td>バイブレーターへのアクセスを可能にします。</td></tr><tr><td>WAKE_LOCK</td><td>normal</td><td>PowerManagerのWakeLocksを使って、プロセッサのスリープや画面の輝度低下を<br>防ぐことができます。</td></tr><tr><td>ACCESS_BACKGROUND_LOCATION</td><td>dangerous</td><td>アプリがバックグラウンドで位置情報にアクセスすることを許可します。<br>この許可を要求する場合は、ACCESS_COARSE_LOCATIONまたは<br>ACCESS_FINE_LOCATIONのいずれかも要求する必要があります。<br>この許可を要求するだけでは、位置情報へのアクセスはできません。</td></tr><tr><td>ACCESS_COARSE_LOCATION</td><td>dangerous</td><td>アプリがおおよその位置情報にアクセスできるようにします。代わりにACCESS_FINE_LOCATIONを指定することもできます。</td></tr><tr><td>ACCESS_FINE_LOCATION</td><td>dangerous</td><td>アプリが正確な位置情報にアクセスできるようにします。代わりにACCESS_COARSE_LOCATIONを指定することもできます。</td></tr><tr><td>ANSWER_PHONE_CALLS</td><td>dangerous</td><td>着信した電話にアプリが応答できるようにします。</td></tr><tr><td>BODY_SENSORS</td><td>dangerous</td><td>心拍数など、ユーザーが体の中で起こっていることを測定するために<br>使用するセンサーからのデータに、アプリケーションがアクセスできるようにします。</td></tr><tr><td>CALL_PHONE</td><td>dangerous</td><td>ユーザーが電話を確認するためのダイアラーユーザーインターフェースを経由せずに、アプリケーションから電話をかけることができます。</td></tr><tr><td>CAMERA</td><td>dangerous</td><td>これにより、すべてのカメラ機能に対して uses-feature マニフェスト要素が<br>自動的に適用されます。すべてのカメラ機能を必要としない場合や、<br>カメラが利用できない場合でも適切に動作する場合は、すべてのカメラ機能を<br>サポートしていないデバイスにインストールするために、<br>マニフェストを適切に変更する必要があります。</td></tr><tr><td>READ_CONTACTS</td><td>dangerous</td><td>アプリケーションがユーザーの連絡先データを読み取ることを許可します。</td></tr><tr><td>READ_EXTERNAL_STORAGE</td><td>dangerous</td><td>アプリケーションが外部ストレージからの読み取りを可能にします。</td></tr><tr><td>READ_PHONE_STATE</td><td>dangerous</td><td>現在の携帯電話ネットワーク情報、進行中の通話のステータス、<br>デバイスに登録されているPhoneAccountsのリストなど、<br>電話の状態への読み取り専用のアクセスを許可します。</td></tr><tr><td>READ_SMS</td><td>dangerous</td><td>アプリケーションがSMSメッセージを読むことを許可します。</td></tr><tr><td>WRITE_EXTERNAL_STORAGE</td><td>dangerous</td><td>アプリケーションによる外部ストレージへの書き込みを許可します。</td></tr></tbody></table></div><figcaption class="wp-element-caption">主要パーミッション一覧</figcaption></figure>



<p></p>



<h2 class="wp-block-heading">カスタム権限について</h2>



<p>　カスタム権限とは、<span class="marker-under">アプリ開発者自身が権限を作成し、機能を制限できる機能</span>のことです。カスタム権限を定義すると、他のアプリとリソースや機能の共有をすることが可能になります。<br>　例えば、通常アプリは他のアプリを起動させることが可能なのですが、他のアプリから自分のアプリを起動されたくないような場合に、カスタム権限を持っている他のアプリのみ自分のアプリを起動することが出来るような権限を作ることが出来ます。以下が例になります。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="    <permission
        android:name=&quot;com.example.myapplication.MY_PERMISSION&quot;
        android:label=&quot;@string/permissoion_label&quot;
        android:description=&quot;@string/permission_description&quot;
        android:permissionGroup=&quot;android.permission-group.COST_MONEY&quot;
        android:protectionLevel=&quot;normal&quot; /&gt;" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">permission</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">android:name</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;com.example.myapplication.MY_PERMISSION&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">android:label</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;@string/permissoion_label&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">android:description</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;@string/permission_description&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">android:permissionGroup</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;android.permission-group.COST_MONEY&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">android:protectionLevel</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;normal&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #808080">/&gt;</span></span></code></pre></div>



<p>　これで定義が完成しましたので、これを利用したい場合には、他のアプリから以下のようにりようすることで、カスタム権限を利用することができるようになります。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="    <uses-permission android:name=&quot;com.example.myapplication.MY_PERMISSION&quot; /&gt;" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">uses-permission</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">android:name</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;com.example.myapplication.MY_PERMISSION&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #808080">/&gt;</span></span></code></pre></div>



<p></p>



<h2 class="wp-block-heading">まとめ</h2>



<p>　本記事ではAndroidアプリ開発における、パーミッション（権限）の概要や、使い方、主要なパーミッション一覧、カスタム権限について説明しました。<br>　Androidアプリ開発では昨今のプライバシーの規制も相まって、必ず権限については確認し、適切に利用することが必要ですので、ぜひ覚えましょう。</p>



<p></p>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://techgrowup.net/permission/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>apk、aab、obbとは何か、何が違うの？　アプリ署名って何？</title>
		<link>https://techgrowup.net/about-apk-aab-obb/</link>
					<comments>https://techgrowup.net/about-apk-aab-obb/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[techgrowup]]></dc:creator>
		<pubDate>Mon, 10 May 2021 07:57:11 +0000</pubDate>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[Androidアプリ開発]]></category>
		<category><![CDATA[署名]]></category>
		<guid isPermaLink="false">https://techgrowup.net/?p=431</guid>

					<description><![CDATA[はじめに 　本記事では、Androidアプリ開発における重要な知識として、apk,aab,obbファイルの概要について説明します。また、Google Play配布時における注意点や、ビルド方法についても説明しています。  [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h1 class="wp-block-heading">はじめに</h1>



<p>　本記事では、Androidアプリ開発における重要な知識として、apk,aab,obbファイルの概要について説明します。また、Google Play配布時における注意点や、ビルド方法についても説明しています。</p>



<p></p>



<h2 class="wp-block-heading">apkとは　</h2>



<p>　apkとは<span class="marker-under-red"><span class="marker-under">「Android Application Package」</span></span>の略称で、<span class="marker-under">.apkの拡張子を持ち、Androidスマホや端末にアプリとしてインストールできるファイル</span>のことです。分かりやすい例でいうと、Windowsだとソフトをインストールする時に、.exeファイルというものをインストールすると思います。.apkファイルも同様にAndroid内でアプリケーションをインストールするためのものです。<br>　apkの中身としてはzip形式のファイルのようなもので、apkを開くと中にアプリケーションを構築するためのファイルなどが格納されています。<span class="marker-under">一般的にはGoogle Playで配布</span>されていることが多く、ユーザーがGoogle Playからapkファイルをダウンロードし、インストールしています。一方あまり知られていはいないですが、Google Driveのようなファイル管理ツールでも、apkをインストールすることも可能です。</p>



<div class="wp-block-cocoon-blocks-icon-box information-box common-icon-box block-box">
<p>apkとはAndroidスマホにアプリをインストールするためのファイル</p>
</div>



<p></p>



<h2 class="wp-block-heading">aabとは</h2>



<p>　<a rel="noopener" target="_blank" href="https://developer.android.com/guide/app-bundle?hl=ja">aab<span class="fa fa-external-link external-icon anchor-icon"></span></a>とは「Android App Bundle」の略称で、<span class="bold-red">.</span><span class="marker-under">aabの拡張子を持ち、多種多様なAndroid端末にapkを配布</span>できるようにしたパッケージの形です。昨今では端末メーカも様々なAndroid端末を出しており、apkファイルをそれぞれの端末に合わせて作っていくのは骨が折れる作業になってしまうので、Googleが「<span class="marker-under">aabの場合は、Google Playで端末に合わせて最適なapkを提供するよ</span>」ということをしてくれます。<br>　aabファイルのメリットとしては下記があげられます。</p>



<ul class="wp-block-list"><li>ファイルサイズを縮小化できる</li><li>複数の端末に適したapkを配布してくれる</li><li>署名の生成・管理はGoogle Playがしてくれる（これは会社によってはダメな場合もあります）</li></ul>



<p></p>



<div class="wp-block-cocoon-blocks-icon-box information-box common-icon-box block-box">
<p>aabとは多様なAndroidスマホに最適化したapkファイルを作ってくれる、apkの進化版パッケージファイル</p>
</div>



<p></p>



<h2 class="wp-block-heading">obbとは</h2>



<p>　<a rel="noopener" target="_blank" href="https://developer.android.com/google/play/expansion-files?hl=ja" data-type="URL" data-id="https://developer.android.com/google/play/expansion-files?hl=ja">obb<span class="fa fa-external-link external-icon anchor-icon"></span></a>とは、「Opaque Binary Blob」の略称で、<span class="marker-under">apkファイルを拡張するためのもの</span>です。Google Playではapkの場合は100MB、aabの場合は150MB以下のサイズにしないとユーザーへアプリを配布できません。大抵のTwitter,Facebook,Lineなどのアプリでは大きなサイズにならないため気にする必要はありません。一方<span class="marker-under">ゲームやARアプリなど、アプリ単体で大きな容量が必要になるアプリはそのまま配布することは出来ません。</span>このような場合に上限2GBまでのファイルをobbファイルとしてGoogle Playに添付することが出来ます。<br>　※ちなみに以前にはGoogle Playからアプリをダウンロードした後、ユーザーはアプリ内で「追加コンテンツをダウンロード」のような、せっかくアプリをダウンロードしたのに追加コンテンツのダウンロードに時間がかかるといった、操作性の悪い状況が起こっていました。obbはこれを解消したものです。</p>



<p>　obbを活用することで、ユーザーはGoogle Playからのダウンロード時に、apkファイルと同時にobbファイルもまとめてダウンロードすることになります。こうすることダウンロード完了と同時に、アプリを開けば必要なファイルが揃っているので<span class="marker-under">すぐにアプリやゲームを始めることが可能</span>になります。</p>



<div class="wp-block-cocoon-blocks-icon-box information-box common-icon-box block-box">
<p>obbはapkファイルを拡張するためのもので、ユーザーがすぐにアプリやゲームを始めることができる。</p>
</div>



<p><br>　</p>



<p></p>



<h2 class="wp-block-heading">アプリ署名とは</h2>



<p>　<a rel="noopener" target="_blank" href="https://developer.android.com/studio/publish/app-signing?hl=ja">アプリ署名<span class="fa fa-external-link external-icon anchor-icon"></span></a>とは、<span class="marker-under">apkファイルに対して証明書としてサインをすることです。</span>例えばクレジットカードなどを利用する時に名前を求められることがあると思います。これは本人確認を筆跡で鑑定できるように手書き文字を証明書として代用しています。これと同様に、apkを配布するときも、<span class="marker-under">そのアプリが誰のものなのか明確にする必要</span>があります。</p>



<p><br>　実際に署名する際には、２つのパターンがあります。<span class="marker-under">１つ目がAndroid Studioによって手動で署名を作成し、アプリに付与する方法</span>です。こちらの場合には署名の管理や作成の手間はかかりますが、信頼性が最も高く自らが無くさなければ安全ということになります。</p>



<p><br>　２つ目は<span class="marker-under">Google Play側で作成・管理を行うもの</span>です。apkファイルを一般のユーザー向けに配布する際、apkをGoogle Playにアップロードしますが、その際に署名を同時に行ってくれ、後の管理も全てGoogleに任せることが可能になります。大企業の場合ですとセキュリティ面やコンプライアンスの懸念もあるため迷う部分もあると思いますが、小規模や個人レベルであればGoogle に任せる方法が最も良い方法可と思います。</p>



<div class="wp-block-cocoon-blocks-icon-box information-box common-icon-box block-box">
<p>apkに署名をすることで、そのアプリの所有者を明確にする</p>
</div>



<h2 class="wp-block-heading">Android Studioのビルド方法</h2>



<p>　最後に実際にapkファイルや、aabファイルをどうやってビルドするのか説明したいと思います。<span class="marker-under">apk,aabファイルを作成するにはAndroid Studioでビルドを行うことが出来ます。</span>Android Studioタブの[Build]→[Build Bundle(s)/APK(s)]→[Build Bundle(s)] or [Build APK(s)]を選択することで、そのプロジェクト内のソースコードを、apkファイルもしくはaabファイルにビルドすることが出来ます。</p>



<div class="wp-block-image"><figure class="aligncenter size-large is-resized"><img loading="lazy" decoding="async" src="https://techgrowup.net/wp-content/uploads/2021/05/build-apk-bundle.png" alt="apkとaabのビルド方法" class="wp-image-485" width="411" height="410" srcset="https://techgrowup.net/wp-content/uploads/2021/05/build-apk-bundle.png 822w, https://techgrowup.net/wp-content/uploads/2021/05/build-apk-bundle-300x300.png 300w, https://techgrowup.net/wp-content/uploads/2021/05/build-apk-bundle-150x150.png 150w, https://techgrowup.net/wp-content/uploads/2021/05/build-apk-bundle-768x766.png 768w, https://techgrowup.net/wp-content/uploads/2021/05/build-apk-bundle-100x100.png 100w" sizes="(max-width: 411px) 100vw, 411px" /><figcaption>apk,aabのビルド方法</figcaption></figure></div>



<p>　また、同様の[Build]タブから[Generate Signed Bundle/APK]を押すことで、アプリ署名の作成やビルドしたアプリに署名を付与することが可能になります。</p>



<p>　ちなみに作成した<span class="marker-under">apk,aabファイルの中身もAndroid Studioで確認することが可能</span>です。今回はapkファイルの中身を見てみましょう。作成されたapkファイルをAndroid Studioにドラッグアンドドロップすると下記のような画像が表示されます。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="351" src="https://techgrowup.net/wp-content/uploads/2021/05/analyize-apk-1024x351.png" alt="apk解析画面" class="wp-image-483" srcset="https://techgrowup.net/wp-content/uploads/2021/05/analyize-apk-1024x351.png 1024w, https://techgrowup.net/wp-content/uploads/2021/05/analyize-apk-300x103.png 300w, https://techgrowup.net/wp-content/uploads/2021/05/analyize-apk-768x264.png 768w, https://techgrowup.net/wp-content/uploads/2021/05/analyize-apk-1536x527.png 1536w, https://techgrowup.net/wp-content/uploads/2021/05/analyize-apk.png 1920w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption>apk解析画面</figcaption></figure>



<p>　冒頭にも説明しましが、apkファイルそのものはzipファイルのようなパッケージになっているだけなので、中身を見ることが可能です。様々なファイルやフォルダがありますが、例えばAndroidManifest.xmlはアプリの設定が記載されているファイルですが、これらも実際に開くことでソースコードを見ることが可能です。</p>



<p><br>　逆に言うと、このような<span class="marker-under">AndroidManifestファイルなどのアプリ情報は一般公開されている</span>と認識してもらえればと思います。更にclasses2.dexというファイルがあると思いますが、こちらに実際のソースコードが入っていますので、ソースコードを「<span class="marker-under">難読化</span>」という処理を行わないと、セキュリティ要素の高いソースコードまで一般の誰でも見れるようになってしまうので注意してください。<br>　※難読化については、また別の記事で説明します。</p>



<h2 class="wp-block-heading">まとめ</h2>



<p>　今回はAndroidアプリ開発における、apk,aab,obb、署名とは何かについて説明しました。これらはアプリをGoogle Playやお客様に配布する際や自分の端末にインストールして確認するときなどには大事なものなので、しっかりと覚えておきましょう。</p>



<p>　実際にAndroidアプリを作ってみたい方は下記から始めてみてください！</p>



<figure class="wp-block-embed is-type-wp-embed is-provider-【techgrowth】-0-から始めるエンジニア入門 wp-block-embed-【techgrowth】-0-から始めるエンジニア入門"><div class="wp-block-embed__wrapper">

<a target="_self" href="https://techgrowup.net/2021/04/28/android-studio-install/" title="Android Studioをインストールする手順(Mac)" class="blogcard-wrap external-blogcard-wrap a-wrap cf"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://techgrowup.net/wp-content/uploads/2021/05/anndorid-install-icatch-1.jpg" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">Android Studioをインストールする手順(Mac)</div><div class="blogcard-snippet external-blogcard-snippet">Android Studioのインストール手順です。Android Studioインストーラーのダウンロードから各種セットアップ、Android AVD(エミュレータ)の設定などを画像つきで確認することが出来ます。</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://techgrowup.net/android-studio-install/" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">techgrowup.net</div></div></div></div></a>
</div></figure>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://techgrowup.net/about-apk-aab-obb/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【Androidアプリ開発】タブで画面を切り替えるアプリの実装</title>
		<link>https://techgrowup.net/android-fragment-tabapp/</link>
					<comments>https://techgrowup.net/android-fragment-tabapp/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[techgrowup]]></dc:creator>
		<pubDate>Sat, 08 May 2021 05:10:20 +0000</pubDate>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[Androidアプリ開発]]></category>
		<category><![CDATA[BottomNavigationView]]></category>
		<category><![CDATA[SharedPreferences]]></category>
		<category><![CDATA[Webview]]></category>
		<guid isPermaLink="false">https://techgrowup.net/?p=380</guid>

					<description><![CDATA[はじめに 　本記事では、BottomNavigationViewを利用してタブを実装し、タブごとのページをFragmentを利用して実装します。　※説明をみながらソースコードを見たいという方がいれば、下記Githubから [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h1 class="wp-block-heading">はじめに</h1>



<p>　本記事では、BottomNavigationViewを利用してタブを実装し、タブごとのページをFragmentを利用して実装します。<br>　※説明をみながらソースコードを見たいという方がいれば、下記Githubからソースをダウンロードしてください</p>




<a rel="noopener" target="_blank" href="https://github.com/daichi-mizuno-tech/BottomNavigationApp" title="GitHub - daichi-mizuno-tech/BottomNavigationApp: BottomNavigationViewを利用したタブアプリケーション" class="blogcard-wrap external-blogcard-wrap a-wrap cf"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://opengraph.githubassets.com/aa117ae51cb2a16088432f67cc994a66687050e8cfdeaf1f739ae5edf4137037/daichi-mizuno-tech/BottomNavigationApp" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">GitHub - daichi-mizuno-tech/BottomNavigationApp: BottomNavigationViewを利用したタブアプリケーション</div><div class="blogcard-snippet external-blogcard-snippet">BottomNavigationViewを利用したタブアプリケーション. Contribute to daichi-mizuno-tech/BottomNavigationApp development by creating an acc...</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://github.com/daichi-mizuno-tech/BottomNavigationApp" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">github.com</div></div></div></div></a>



<p></p>



<h2 class="wp-block-heading">タブアプリについて</h2>



<h3 class="wp-block-heading">最終的なゴール</h3>



<p>　今回作るものは下記のような動画のアプリケーションになります。シンプルですが、<span class="marker-under">タブを配置し、タブの切替、Webページ、Webページの設定などをFragment間で切り替えられる仕様</span>になっています。</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-4-3 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="Androidアプリ開発 BottomNavigaitonViewとFragmentを利用したタブアプリケーション" width="1256" height="942" src="https://www.youtube.com/embed/NWYunr40AL4?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<h3 class="wp-block-heading">アプリのUI構成</h3>



<p>　アプリのUI構成については、画面下部にタブを2つ配置し、それぞれ「ホーム」「設定」というタブを作りたいと思います。<br>　また、それぞれのタブを押すとFragmentが切り替わり、「ホーム」タブでは本サイトの記事が表示されるWebViewを使い、「設定」画面ではWebviewの設定を変更できるようにします<span class="marker-under">。ホーム画面と設定画面のデータのやりとりはSharedPreferencesというクラス</span>を利用して受け渡しています。</p>



<p></p>



<h2 class="wp-block-heading">利用するライブラリ(クラス)の説明</h2>



<h3 class="wp-block-heading">Webview</h3>



<p>　<span class="marker-under"><a rel="noopener" target="_blank" href="https://developer.android.com/reference/android/webkit/WebView" data-type="URL">WebView<span class="fa fa-external-link external-icon anchor-icon"></span></a>とはViewというクラスの拡張で、ウェブページを表示するためのもの</span>です。通常みなさんがウェブページを開くときは、SafariやChromeなどのブラウザを利用すると思いますが、自分のアプリなのに毎回ユーザーにChromeなどを開かせると、利便性が悪くなってしまいます。<br>　そこで<span class="marker-under">WebViewをアプリ内に組み込むことで、自分のアプリ内でウェブページを開くことができます</span>。Chromeのようにブックマーク、ナビゲーション、アドレスバー等はないためシンプルなものにはなりますが、とても使いやすいです。</p>



<h3 class="wp-block-heading">BottomNavigationView</h3>



<p>　<span class="marker-under"><a rel="noopener" target="_blank" href="https://developer.android.com/reference/com/google/android/material/bottomnavigation/BottomNavigationView">BottomNavigationView<span class="fa fa-external-link external-icon anchor-icon"></span></a>とは画面下部にボタンを配置し、ナビゲーションを実装するためのクラス</span>で、ユーザーが画面を切り替えるために利用されています。<br>　このBottomNavigationViewを利用すると、タブ切り替えの実装やボタンの配置などを自由に簡単にカスタマイズできたり、Fragmentとの相性がいいためコンポーネント単位で実装が用意になります。</p>



<p></p>



<h3 class="wp-block-heading"><em>SharedPreferences</em></h3>



<p>　<span class="marker-under"><a rel="noopener" target="_blank" href="https://developer.android.com/reference/android/content/SharedPreferences">SharedPreferences<span class="fa fa-external-link external-icon anchor-icon"></span></a>はアプリ内のデータを追加/保存/修正/削除などをxml形式で簡単に保存できるようにしたクラス</span>です。通常データを保存する際にはAndroidのSQLiteというDBを使うこともありますが、データ量が少ないのであればDBを作るのは高機能すぎるため、大きなデータを扱わない限りは、SharedPreferencesで十分と言えます。<br>　余談ですが、<span class="marker-under">Androidアプリではデータを保存するためにxml以外にもjsonファイルなどもよく利用され</span>ます。</p>



<p></p>



<h2 class="wp-block-heading">アプリの実装</h2>



<h3 class="wp-block-heading">実装の流れを考える</h3>



<p>　<span class="bold-red">アプリを開発するときは、どのような流れで実装を行っていくか考えましょう</span>。今回の場合だとタブを切り替えて各画面を表示し、Webview画面と設定画面の中身が表示されるという流れになりますので、流れとしては下記で行っていきます。</p>



<ol class="wp-block-list">
<li>BottomNavigationViewでタブの実装</li>



<li>タブを押した時に表示するFragment(ホームと設定）の実装</li>



<li>ホーム画面のWebviewの実装</li>



<li>設定画面の設定項目の実装</li>



<li>設定を保存するためのSharedPreferencesの実装</li>



<li>細かい部分の調整</li>
</ol>



<p>　また、ここからは流れに沿ってソースコードを記載しますが、ソースコードを記述する場所や関数名、レイアウトの中身などは細かく説明しませんので、少しずつ自分で調整してみてください。</p>



<h3 class="wp-block-heading">1.BottomNavigationViewでタブの実装</h3>



<p>　まずBottomNavigationViewを利用するためにタブを作成するための/resフォルダの下に、<strong>/menu/my_nav_item.xml</strong>を作成します。これをBottomNavigationViewにつけることで、タブが作成できます。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="<?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
<menu xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;&gt;
    <item android:id=&quot;@+id/action_home&quot;
        android:title=&quot;ホーム&quot;
        android:icon=&quot;@drawable/ic_baseline_home_24&quot; /&gt;
    <item android:id=&quot;@+id/action_setting&quot;
        android:title=&quot;設定&quot;
        android:icon=&quot;@drawable/ic_baseline_settings_24&quot; /&gt;
</menu&gt;" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #808080">&lt;?</span><span style="color: #569CD6">xml</span><span style="color: #9CDCFE"> version</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;1.0&quot;</span><span style="color: #9CDCFE"> encoding</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;utf-8&quot;</span><span style="color: #808080">?&gt;</span></span>
<span class="line"><span style="color: #808080">&lt;</span><span style="color: #569CD6">menu</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">xmlns:android</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;http://schemas.android.com/apk/res/android&quot;</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">item</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">android:id</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;@+id/action_home&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">android:title</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;ホーム&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">android:icon</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;@drawable/ic_baseline_home_24&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #808080">/&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">item</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">android:id</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;@+id/action_setting&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">android:title</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;設定&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">android:icon</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;@drawable/ic_baseline_settings_24&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #808080">/&gt;</span></span>
<span class="line"><span style="color: #808080">&lt;/</span><span style="color: #569CD6">menu</span><span style="color: #808080">&gt;</span></span></code></pre></div>



<p>　次にmain_activity.xmlのレイアウトにBottomNavigationViewを下位置に配置します。そして、<span class="marker-under">MainActivity.ktにBottomNavigationView.OnNavigatiojnItemSelectedListenerを継承させ、タブが押されたときのコールバック関数を定義</span>します。<br> 　続いて、レイアウトに配置したBottomNavigationViewをfindViewByIdで参照し、onNavigationItemSelectedを加えます。最後にonNavigationItemSelectedのコールバック関数内で各タブ(アイテム）が選択された時にFragmentを参照するような処理にします。参照するときのレイアウトはFrameLayoutを使ってcontainerというidを使っています。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="class MainActivity : AppCompatActivity() ,BottomNavigationView.OnNavigationItemSelectedListener{


	override fun onCreate(savedInstanceState: Bundle?) {
		super.onCreate(savedInstanceState)
		setContentView(R.layout.activity_main)

		initializeResource()
	}

	fun initializeResource(){
//		BottomNavigationViewを設定
		val bottomNavigationView = findViewById<BottomNavigationView&gt;(R.id.bottom_navigation_view)
		bottomNavigationView.setOnNavigationItemSelectedListener(this)
		bottomNavigationView.itemIconSize = 70
		bottomNavigationView.scaleX = 1.2f
		bottomNavigationView.scaleY = 1.2f

	}

	override fun onNavigationItemSelected(item: MenuItem): Boolean {
		Log.d(TAG,&quot;Selected item: &quot; + item)

		when(item.itemId){
//			ホームボタンが押された時
			R.id.action_home -&gt; {
				supportFragmentManager.beginTransaction()
						.replace(R.id.container,HomeFragment())
						.setReorderingAllowed(true)
						.commit()
			}
//			設定ボタンが押された時
			R.id.action_setting -&gt; {
				supportFragmentManager.beginTransaction()
						.replace(R.id.container,SettingFragment())
						.setReorderingAllowed(true)
						.commit()
			}

		}

		return true
	}

	companion object{
		const val TAG : String = &quot;MainActivity&quot;
	}
}" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">MainActivity</span><span style="color: #D4D4D4"> : </span><span style="color: #4EC9B0">AppCompatActivity</span><span style="color: #D4D4D4">() ,BottomNavigationView.</span><span style="color: #DCDCAA">OnNavigationItemSelectedListener</span><span style="color: #D4D4D4">{</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">	</span><span style="color: #569CD6">override</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">fun</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">onCreate</span><span style="color: #D4D4D4">(savedInstanceState: </span><span style="color: #4EC9B0">Bundle</span><span style="color: #D4D4D4">?) {</span></span>
<span class="line"><span style="color: #D4D4D4">		</span><span style="color: #569CD6">super</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">onCreate</span><span style="color: #D4D4D4">(savedInstanceState)</span></span>
<span class="line"><span style="color: #D4D4D4">		</span><span style="color: #DCDCAA">setContentView</span><span style="color: #D4D4D4">(R.layout.activity_main)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">		</span><span style="color: #DCDCAA">initializeResource</span><span style="color: #D4D4D4">()</span></span>
<span class="line"><span style="color: #D4D4D4">	}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">	</span><span style="color: #569CD6">fun</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">initializeResource</span><span style="color: #D4D4D4">(){</span></span>
<span class="line"><span style="color: #6A9955">//		BottomNavigationViewを設定</span></span>
<span class="line"><span style="color: #D4D4D4">		</span><span style="color: #569CD6">val</span><span style="color: #D4D4D4"> bottomNavigationView = </span><span style="color: #DCDCAA">findViewById</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">BottomNavigationView</span><span style="color: #D4D4D4">&gt;(R.id.bottom_navigation_view)</span></span>
<span class="line"><span style="color: #D4D4D4">		bottomNavigationView.</span><span style="color: #DCDCAA">setOnNavigationItemSelectedListener</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">this</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">		bottomNavigationView.itemIconSize = </span><span style="color: #B5CEA8">70</span></span>
<span class="line"><span style="color: #D4D4D4">		bottomNavigationView.scaleX = </span><span style="color: #B5CEA8">1.2f</span></span>
<span class="line"><span style="color: #D4D4D4">		bottomNavigationView.scaleY = </span><span style="color: #B5CEA8">1.2f</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">	}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">	</span><span style="color: #569CD6">override</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">fun</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">onNavigationItemSelected</span><span style="color: #D4D4D4">(item: </span><span style="color: #4EC9B0">MenuItem</span><span style="color: #D4D4D4">): </span><span style="color: #4EC9B0">Boolean</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">		Log.</span><span style="color: #DCDCAA">d</span><span style="color: #D4D4D4">(TAG,</span><span style="color: #CE9178">&quot;Selected item: &quot;</span><span style="color: #D4D4D4"> + item)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">		</span><span style="color: #C586C0">when</span><span style="color: #D4D4D4">(item.itemId){</span></span>
<span class="line"><span style="color: #6A9955">//			ホームボタンが押された時</span></span>
<span class="line"><span style="color: #D4D4D4">			R.id.action_home </span><span style="color: #569CD6">-&gt;</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">				supportFragmentManager.</span><span style="color: #DCDCAA">beginTransaction</span><span style="color: #D4D4D4">()</span></span>
<span class="line"><span style="color: #D4D4D4">						.</span><span style="color: #DCDCAA">replace</span><span style="color: #D4D4D4">(R.id.container,</span><span style="color: #DCDCAA">HomeFragment</span><span style="color: #D4D4D4">())</span></span>
<span class="line"><span style="color: #D4D4D4">						.</span><span style="color: #DCDCAA">setReorderingAllowed</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">true</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">						.</span><span style="color: #DCDCAA">commit</span><span style="color: #D4D4D4">()</span></span>
<span class="line"><span style="color: #D4D4D4">			}</span></span>
<span class="line"><span style="color: #6A9955">//			設定ボタンが押された時</span></span>
<span class="line"><span style="color: #D4D4D4">			R.id.action_setting </span><span style="color: #569CD6">-&gt;</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">				supportFragmentManager.</span><span style="color: #DCDCAA">beginTransaction</span><span style="color: #D4D4D4">()</span></span>
<span class="line"><span style="color: #D4D4D4">						.</span><span style="color: #DCDCAA">replace</span><span style="color: #D4D4D4">(R.id.container,</span><span style="color: #DCDCAA">SettingFragment</span><span style="color: #D4D4D4">())</span></span>
<span class="line"><span style="color: #D4D4D4">						.</span><span style="color: #DCDCAA">setReorderingAllowed</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">true</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">						.</span><span style="color: #DCDCAA">commit</span><span style="color: #D4D4D4">()</span></span>
<span class="line"><span style="color: #D4D4D4">			}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">		}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">		</span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">true</span></span>
<span class="line"><span style="color: #D4D4D4">	}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">	</span><span style="color: #569CD6">companion</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">object</span><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">		</span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">val</span><span style="color: #D4D4D4"> TAG : </span><span style="color: #4EC9B0">String</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&quot;MainActivity&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">	}</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="772" src="https://techgrowup.net/wp-content/uploads/2021/05/fragment-app-mainlayout-1024x772.jpg" alt="Fragmentを利用したタブアプリ開発のメインレイアウト" class="wp-image-418" srcset="https://techgrowup.net/wp-content/uploads/2021/05/fragment-app-mainlayout-1024x772.jpg 1024w, https://techgrowup.net/wp-content/uploads/2021/05/fragment-app-mainlayout-300x226.jpg 300w, https://techgrowup.net/wp-content/uploads/2021/05/fragment-app-mainlayout-768x579.jpg 768w, https://techgrowup.net/wp-content/uploads/2021/05/fragment-app-mainlayout-1536x1158.jpg 1536w, https://techgrowup.net/wp-content/uploads/2021/05/fragment-app-mainlayout.jpg 1920w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">main_activity.xml</figcaption></figure>



<h3 class="wp-block-heading">2.タブを押した時に表示するFragment(ホームと設定）の作成</h3>



<p>　タブの設定が終わったので、次にタブを押した時にcontainerのidに表示するFragmentを作成します。作成方法はAndroid Studioのメニューから右クリックをし<span class="marker-under">、[New]-&gt;[Fragment]-&gt;[Fragment(Blank)]で作成することができます。</span><br>　今回は「HomeFragment」と「SettingFragment」という名前のFragmentを作りました。</p>



<h3 class="wp-block-heading">3.ホーム画面のWebviewの実装</h3>



<p>　続いて、HomeFragmentにWebViewを実装します。Fragment作成時に、fragment_home.xmlというレイアウトファイルができていると思いますので、そちらに<span class="marker-under">WebViewを全体に配置</span>します。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="795" src="https://techgrowup.net/wp-content/uploads/2021/05/fragment-app-homelayout-1024x795.png" alt="Fragmentを利用したタブアプリ開発のホームレイアウト" class="wp-image-417" srcset="https://techgrowup.net/wp-content/uploads/2021/05/fragment-app-homelayout-1024x795.png 1024w, https://techgrowup.net/wp-content/uploads/2021/05/fragment-app-homelayout-300x233.png 300w, https://techgrowup.net/wp-content/uploads/2021/05/fragment-app-homelayout-768x596.png 768w, https://techgrowup.net/wp-content/uploads/2021/05/fragment-app-homelayout-1536x1192.png 1536w, https://techgrowup.net/wp-content/uploads/2021/05/fragment-app-homelayout.png 1920w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">fragment_home.xml</figcaption></figure>



<h3 class="wp-block-heading">4.設定画面の設定項目の実装</h3>



<p>　続いて、SettingFragment作成時にも、fragment_setting.xmlというレイアウトファイルができていると思いますので、こちらに<span class="marker-under">「Webviewで読み込むURL」，「キャッシュ方法」、「ズーム倍率」をユーザーが入力するためのビューと、「保存」ボタンを配置</span>します。<br>　※配置方法がよくわからない場合は、とりあえずUIが崩れていても問題ないので配置してみてください。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="777" src="https://techgrowup.net/wp-content/uploads/2021/05/fragment-app-settinglayout-1024x777.jpg" alt="Fragmentを利用したタブアプリ開発の設定レイアウト" class="wp-image-419" srcset="https://techgrowup.net/wp-content/uploads/2021/05/fragment-app-settinglayout-1024x777.jpg 1024w, https://techgrowup.net/wp-content/uploads/2021/05/fragment-app-settinglayout-300x228.jpg 300w, https://techgrowup.net/wp-content/uploads/2021/05/fragment-app-settinglayout-768x583.jpg 768w, https://techgrowup.net/wp-content/uploads/2021/05/fragment-app-settinglayout-1536x1166.jpg 1536w, https://techgrowup.net/wp-content/uploads/2021/05/fragment-app-settinglayout.jpg 1920w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">fragment_setting.xml</figcaption></figure>



<h3 class="wp-block-heading">5.設定を保存するためのSharedPreferencesの実装</h3>



<p>　続いて、SettingFragmentで修正や保存したデータをHomeFragmentでも利用したいので、MySharedPrefsというクラスを作成し、SharedPreferencesを利用します。<br>　※クラスの作成方法は、プロジェクト内のパッケージ名で右クリックし、<span class="marker-under">[New]-&gt;[Kotlin Class/File]で作成</span>できます。</p>



<p>　MySharedPrefesの中身としては、url、キャッシュ方法、ズーム倍率を保存/取得したいので、下記のように記述します。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="class MySharedPrefs (context: Context){
	private val preferences = context.getSharedPreferences(&quot;MyPrefs&quot;, Context.MODE_PRIVATE)
	private val urlKey = &quot;url&quot;
	private val cacheKey = &quot;cache&quot;
	private val zoomKey = &quot;zoom&quot;

	fun getUrl() : String?{
		return preferences.getString(urlKey,&quot;https://techgrowup.net/&quot;)
	}

	fun setUrl(value : String){
		val editor = preferences.edit()
		editor.putString(urlKey,value)
		editor.apply()
	}

	fun getCache() :  Int{
		return preferences.getInt(cacheKey, CACHE_DEFAULT)
	}

	fun setCache(value: Int){
		val editor = preferences.edit()
		editor.putInt(cacheKey,value)
		editor.apply()
	}

	fun getZoom() :  Int{
		return preferences.getInt(zoomKey, ZOOM_DEFAULT)
	}

	fun setZoom(value: Int){
		val editor = preferences.edit()
		editor.putInt(zoomKey,value)
		editor.apply()
	}

	companion object{
		const val CACHE_DEFAULT= 1
		const val NO_CACHE = 2
		const val CACHE_ONLY = 3

		const val ZOOM_DEFAULT = 100
	}
}" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">MySharedPrefs</span><span style="color: #D4D4D4"> (context: </span><span style="color: #4EC9B0">Context</span><span style="color: #D4D4D4">){</span></span>
<span class="line"><span style="color: #D4D4D4">	</span><span style="color: #569CD6">private</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">val</span><span style="color: #D4D4D4"> preferences = context.</span><span style="color: #DCDCAA">getSharedPreferences</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;MyPrefs&quot;</span><span style="color: #D4D4D4">, Context.MODE_PRIVATE)</span></span>
<span class="line"><span style="color: #D4D4D4">	</span><span style="color: #569CD6">private</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">val</span><span style="color: #D4D4D4"> urlKey = </span><span style="color: #CE9178">&quot;url&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">	</span><span style="color: #569CD6">private</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">val</span><span style="color: #D4D4D4"> cacheKey = </span><span style="color: #CE9178">&quot;cache&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">	</span><span style="color: #569CD6">private</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">val</span><span style="color: #D4D4D4"> zoomKey = </span><span style="color: #CE9178">&quot;zoom&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">	</span><span style="color: #569CD6">fun</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">getUrl</span><span style="color: #D4D4D4">() : </span><span style="color: #4EC9B0">String</span><span style="color: #D4D4D4">?{</span></span>
<span class="line"><span style="color: #D4D4D4">		</span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> preferences.</span><span style="color: #DCDCAA">getString</span><span style="color: #D4D4D4">(urlKey,</span><span style="color: #CE9178">&quot;https://techgrowup.net/&quot;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">	}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">	</span><span style="color: #569CD6">fun</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">setUrl</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">value</span><span style="color: #D4D4D4"> : </span><span style="color: #4EC9B0">String</span><span style="color: #D4D4D4">){</span></span>
<span class="line"><span style="color: #D4D4D4">		</span><span style="color: #569CD6">val</span><span style="color: #D4D4D4"> editor = preferences.</span><span style="color: #DCDCAA">edit</span><span style="color: #D4D4D4">()</span></span>
<span class="line"><span style="color: #D4D4D4">		editor.</span><span style="color: #DCDCAA">putString</span><span style="color: #D4D4D4">(urlKey,</span><span style="color: #569CD6">value</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">		editor.</span><span style="color: #DCDCAA">apply</span><span style="color: #D4D4D4">()</span></span>
<span class="line"><span style="color: #D4D4D4">	}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">	</span><span style="color: #569CD6">fun</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">getCache</span><span style="color: #D4D4D4">() :  </span><span style="color: #4EC9B0">Int</span><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">		</span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> preferences.</span><span style="color: #DCDCAA">getInt</span><span style="color: #D4D4D4">(cacheKey, CACHE_DEFAULT)</span></span>
<span class="line"><span style="color: #D4D4D4">	}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">	</span><span style="color: #569CD6">fun</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">setCache</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">value</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">Int</span><span style="color: #D4D4D4">){</span></span>
<span class="line"><span style="color: #D4D4D4">		</span><span style="color: #569CD6">val</span><span style="color: #D4D4D4"> editor = preferences.</span><span style="color: #DCDCAA">edit</span><span style="color: #D4D4D4">()</span></span>
<span class="line"><span style="color: #D4D4D4">		editor.</span><span style="color: #DCDCAA">putInt</span><span style="color: #D4D4D4">(cacheKey,</span><span style="color: #569CD6">value</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">		editor.</span><span style="color: #DCDCAA">apply</span><span style="color: #D4D4D4">()</span></span>
<span class="line"><span style="color: #D4D4D4">	}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">	</span><span style="color: #569CD6">fun</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">getZoom</span><span style="color: #D4D4D4">() :  </span><span style="color: #4EC9B0">Int</span><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">		</span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> preferences.</span><span style="color: #DCDCAA">getInt</span><span style="color: #D4D4D4">(zoomKey, ZOOM_DEFAULT)</span></span>
<span class="line"><span style="color: #D4D4D4">	}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">	</span><span style="color: #569CD6">fun</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">setZoom</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">value</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">Int</span><span style="color: #D4D4D4">){</span></span>
<span class="line"><span style="color: #D4D4D4">		</span><span style="color: #569CD6">val</span><span style="color: #D4D4D4"> editor = preferences.</span><span style="color: #DCDCAA">edit</span><span style="color: #D4D4D4">()</span></span>
<span class="line"><span style="color: #D4D4D4">		editor.</span><span style="color: #DCDCAA">putInt</span><span style="color: #D4D4D4">(zoomKey,</span><span style="color: #569CD6">value</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">		editor.</span><span style="color: #DCDCAA">apply</span><span style="color: #D4D4D4">()</span></span>
<span class="line"><span style="color: #D4D4D4">	}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">	</span><span style="color: #569CD6">companion</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">object</span><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">		</span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">val</span><span style="color: #D4D4D4"> CACHE_DEFAULT= </span><span style="color: #B5CEA8">1</span></span>
<span class="line"><span style="color: #D4D4D4">		</span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">val</span><span style="color: #D4D4D4"> NO_CACHE = </span><span style="color: #B5CEA8">2</span></span>
<span class="line"><span style="color: #D4D4D4">		</span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">val</span><span style="color: #D4D4D4"> CACHE_ONLY = </span><span style="color: #B5CEA8">3</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">		</span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">val</span><span style="color: #D4D4D4"> ZOOM_DEFAULT = </span><span style="color: #B5CEA8">100</span></span>
<span class="line"><span style="color: #D4D4D4">	}</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<h3 class="wp-block-heading">6.細かい部分の調整</h3>



<p>　ここまでできたら、大枠がほとんど完成しましたので、ActivityとFragment同士を繋げます。初めに、<span class="marker-under">SettingFragmentでMySharedPrefsにデータを保存する部分を作成</span>します。下記がSettingFragment.ktの全体像です。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="class SettingFragment : Fragment() {
    lateinit var  mySharedPrefs : MySharedPrefs

    lateinit var saveButton: Button
    lateinit var urlText : TextView
    lateinit var cacheRadioGroup : RadioGroup
    lateinit var zoomText: TextView


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    }

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        val view = inflater.inflate(R.layout.fragment_setting, container, false)
        initializeResource(view)

        return view
    }

    fun initializeResource(view : View){
//        SharedPreferenceのインスタンス生成
        mySharedPrefs = MySharedPrefs(context!!)

//        保存ボタンの初期設定
        saveButton = view.findViewById<Button&gt;(R.id.save_button)
        saveButton.setOnClickListener {
            saveData(saveButton)
        }

//        埋め込みURLの初期設定
        urlText = view.findViewById<TextView&gt;(R.id.url_plaintext)
        urlText.text = mySharedPrefs.getUrl()

//        キャッシュタイプラジオボタンの初期設定
        cacheRadioGroup = view.findViewById<RadioGroup&gt;(R.id.cache_radiogroup)
        when (mySharedPrefs.getCache()){
            MySharedPrefs.CACHE_DEFAULT -&gt; cacheRadioGroup.check(R.id.cache_default_radiobutton)
            MySharedPrefs.NO_CACHE -&gt; cacheRadioGroup.check(R.id.nocache_radiobutton)
            MySharedPrefs.CACHE_ONLY -&gt; cacheRadioGroup.check(R.id.cacheonly_radiobutton)
        }

//        ズーム倍率の初期設定
        zoomText = view.findViewById<TextView&gt;(R.id.textzoom_plaintext)
        zoomText.text = mySharedPrefs.getZoom().toString()
    }


    fun saveData(view : View){
//        データの取得
        Log.d(TAG,&quot;save datas&quot;)
        val url = urlText.text.toString()
        val checkedRadioButton = cacheRadioGroup.checkedRadioButtonId
        var cacheType = MySharedPrefs.CACHE_DEFAULT
        when(checkedRadioButton){
            R.id.cache_default_radiobutton -&gt; cacheType = MySharedPrefs.CACHE_DEFAULT
            R.id.nocache_radiobutton -&gt; cacheType = MySharedPrefs.NO_CACHE
            R.id.cacheonly_radiobutton -&gt; cacheType = MySharedPrefs.CACHE_ONLY
        }
        val zoom = Integer.parseInt(zoomText.text.toString())

//        データの保存
        mySharedPrefs.setUrl(url)
        mySharedPrefs.setCache(cacheType)
        mySharedPrefs.setZoom(zoom)

        Toast.makeText(context,&quot;データが更新されました。&quot;,Toast.LENGTH_LONG).show()
    }

    companion object {
       const val TAG : String = &quot;SettingFragment&quot;
    }
}" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">SettingFragment</span><span style="color: #D4D4D4"> : </span><span style="color: #4EC9B0">Fragment</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">lateinit</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">var</span><span style="color: #D4D4D4">  mySharedPrefs : </span><span style="color: #4EC9B0">MySharedPrefs</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">lateinit</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> saveButton: </span><span style="color: #4EC9B0">Button</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">lateinit</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> urlText : </span><span style="color: #4EC9B0">TextView</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">lateinit</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> cacheRadioGroup : </span><span style="color: #4EC9B0">RadioGroup</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">lateinit</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> zoomText: </span><span style="color: #4EC9B0">TextView</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">override</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">fun</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">onCreate</span><span style="color: #D4D4D4">(savedInstanceState: </span><span style="color: #4EC9B0">Bundle</span><span style="color: #D4D4D4">?) {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">super</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">onCreate</span><span style="color: #D4D4D4">(savedInstanceState)</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">override</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">fun</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">onCreateView</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">        inflater: </span><span style="color: #4EC9B0">LayoutInflater</span><span style="color: #D4D4D4">, container: </span><span style="color: #4EC9B0">ViewGroup</span><span style="color: #D4D4D4">?,</span></span>
<span class="line"><span style="color: #D4D4D4">        savedInstanceState: </span><span style="color: #4EC9B0">Bundle</span><span style="color: #D4D4D4">?</span></span>
<span class="line"><span style="color: #D4D4D4">    ): </span><span style="color: #4EC9B0">View</span><span style="color: #D4D4D4">? {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">val</span><span style="color: #D4D4D4"> view = inflater.</span><span style="color: #DCDCAA">inflate</span><span style="color: #D4D4D4">(R.layout.fragment_setting, container, </span><span style="color: #569CD6">false</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">initializeResource</span><span style="color: #D4D4D4">(view)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> view</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">fun</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">initializeResource</span><span style="color: #D4D4D4">(view : </span><span style="color: #4EC9B0">View</span><span style="color: #D4D4D4">){</span></span>
<span class="line"><span style="color: #6A9955">//        SharedPreferenceのインスタンス生成</span></span>
<span class="line"><span style="color: #D4D4D4">        mySharedPrefs = </span><span style="color: #DCDCAA">MySharedPrefs</span><span style="color: #D4D4D4">(context!!)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">//        保存ボタンの初期設定</span></span>
<span class="line"><span style="color: #D4D4D4">        saveButton = view.</span><span style="color: #DCDCAA">findViewById</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">Button</span><span style="color: #D4D4D4">&gt;(R.id.save_button)</span></span>
<span class="line"><span style="color: #D4D4D4">        saveButton.</span><span style="color: #DCDCAA">setOnClickListener</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #DCDCAA">saveData</span><span style="color: #D4D4D4">(saveButton)</span></span>
<span class="line"><span style="color: #D4D4D4">        }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">//        埋め込みURLの初期設定</span></span>
<span class="line"><span style="color: #D4D4D4">        urlText = view.</span><span style="color: #DCDCAA">findViewById</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">TextView</span><span style="color: #D4D4D4">&gt;(R.id.url_plaintext)</span></span>
<span class="line"><span style="color: #D4D4D4">        urlText.text = mySharedPrefs.</span><span style="color: #DCDCAA">getUrl</span><span style="color: #D4D4D4">()</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">//        キャッシュタイプラジオボタンの初期設定</span></span>
<span class="line"><span style="color: #D4D4D4">        cacheRadioGroup = view.</span><span style="color: #DCDCAA">findViewById</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">RadioGroup</span><span style="color: #D4D4D4">&gt;(R.id.cache_radiogroup)</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">when</span><span style="color: #D4D4D4"> (mySharedPrefs.</span><span style="color: #DCDCAA">getCache</span><span style="color: #D4D4D4">()){</span></span>
<span class="line"><span style="color: #D4D4D4">            MySharedPrefs.CACHE_DEFAULT </span><span style="color: #569CD6">-&gt;</span><span style="color: #D4D4D4"> cacheRadioGroup.</span><span style="color: #DCDCAA">check</span><span style="color: #D4D4D4">(R.id.cache_default_radiobutton)</span></span>
<span class="line"><span style="color: #D4D4D4">            MySharedPrefs.NO_CACHE </span><span style="color: #569CD6">-&gt;</span><span style="color: #D4D4D4"> cacheRadioGroup.</span><span style="color: #DCDCAA">check</span><span style="color: #D4D4D4">(R.id.nocache_radiobutton)</span></span>
<span class="line"><span style="color: #D4D4D4">            MySharedPrefs.CACHE_ONLY </span><span style="color: #569CD6">-&gt;</span><span style="color: #D4D4D4"> cacheRadioGroup.</span><span style="color: #DCDCAA">check</span><span style="color: #D4D4D4">(R.id.cacheonly_radiobutton)</span></span>
<span class="line"><span style="color: #D4D4D4">        }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">//        ズーム倍率の初期設定</span></span>
<span class="line"><span style="color: #D4D4D4">        zoomText = view.</span><span style="color: #DCDCAA">findViewById</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">TextView</span><span style="color: #D4D4D4">&gt;(R.id.textzoom_plaintext)</span></span>
<span class="line"><span style="color: #D4D4D4">        zoomText.text = mySharedPrefs.</span><span style="color: #DCDCAA">getZoom</span><span style="color: #D4D4D4">().</span><span style="color: #DCDCAA">toString</span><span style="color: #D4D4D4">()</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">fun</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">saveData</span><span style="color: #D4D4D4">(view : </span><span style="color: #4EC9B0">View</span><span style="color: #D4D4D4">){</span></span>
<span class="line"><span style="color: #6A9955">//        データの取得</span></span>
<span class="line"><span style="color: #D4D4D4">        Log.</span><span style="color: #DCDCAA">d</span><span style="color: #D4D4D4">(TAG,</span><span style="color: #CE9178">&quot;save datas&quot;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">val</span><span style="color: #D4D4D4"> url = urlText.text.</span><span style="color: #DCDCAA">toString</span><span style="color: #D4D4D4">()</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">val</span><span style="color: #D4D4D4"> checkedRadioButton = cacheRadioGroup.checkedRadioButtonId</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> cacheType = MySharedPrefs.CACHE_DEFAULT</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">when</span><span style="color: #D4D4D4">(checkedRadioButton){</span></span>
<span class="line"><span style="color: #D4D4D4">            R.id.cache_default_radiobutton </span><span style="color: #569CD6">-&gt;</span><span style="color: #D4D4D4"> cacheType = MySharedPrefs.CACHE_DEFAULT</span></span>
<span class="line"><span style="color: #D4D4D4">            R.id.nocache_radiobutton </span><span style="color: #569CD6">-&gt;</span><span style="color: #D4D4D4"> cacheType = MySharedPrefs.NO_CACHE</span></span>
<span class="line"><span style="color: #D4D4D4">            R.id.cacheonly_radiobutton </span><span style="color: #569CD6">-&gt;</span><span style="color: #D4D4D4"> cacheType = MySharedPrefs.CACHE_ONLY</span></span>
<span class="line"><span style="color: #D4D4D4">        }</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">val</span><span style="color: #D4D4D4"> zoom = Integer.</span><span style="color: #DCDCAA">parseInt</span><span style="color: #D4D4D4">(zoomText.text.</span><span style="color: #DCDCAA">toString</span><span style="color: #D4D4D4">())</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">//        データの保存</span></span>
<span class="line"><span style="color: #D4D4D4">        mySharedPrefs.</span><span style="color: #DCDCAA">setUrl</span><span style="color: #D4D4D4">(url)</span></span>
<span class="line"><span style="color: #D4D4D4">        mySharedPrefs.</span><span style="color: #DCDCAA">setCache</span><span style="color: #D4D4D4">(cacheType)</span></span>
<span class="line"><span style="color: #D4D4D4">        mySharedPrefs.</span><span style="color: #DCDCAA">setZoom</span><span style="color: #D4D4D4">(zoom)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">        Toast.</span><span style="color: #DCDCAA">makeText</span><span style="color: #D4D4D4">(context,</span><span style="color: #CE9178">&quot;データが更新されました。&quot;</span><span style="color: #D4D4D4">,Toast.LENGTH_LONG).</span><span style="color: #DCDCAA">show</span><span style="color: #D4D4D4">()</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">companion</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">object</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">       </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">val</span><span style="color: #D4D4D4"> TAG : </span><span style="color: #4EC9B0">String</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&quot;SettingFragment&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p>　これで設定画面でデータを保存することができるようになりましたので、続いてはH<span class="marker-under">omeFragmentでMySharedPrefsから受け取る処理</span>を作りたいと思います。以下がHomeFragmentの全コードです。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="class HomeFragment : Fragment() {
    lateinit var  mySharedPrefs : MySharedPrefs

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

    }

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        val view = inflater.inflate(R.layout.fragment_home, container, false)
        initializeResource(view)

        return view
    }

    fun initializeResource(view : View){
//        SharedPreferenceのインスタンス生成
        mySharedPrefs = MySharedPrefs(context!!)

//        データの取得
        val url = mySharedPrefs.getUrl()
        val cacheType = mySharedPrefs.getCache()
        val zoom = mySharedPrefs.getZoom()

//        WebViewの設定
        val webView = view.findViewById<WebView&gt;(R.id.webview)
        webView.webViewClient = WebViewClient()
        webView.settings.javaScriptEnabled = true

        when(cacheType){
            MySharedPrefs.CACHE_DEFAULT -&gt; webView.settings.cacheMode = WebSettings.LOAD_DEFAULT
            MySharedPrefs.NO_CACHE -&gt; webView.settings.cacheMode = WebSettings.LOAD_NO_CACHE
            MySharedPrefs.CACHE_ONLY -&gt; webView.settings.cacheMode = WebSettings.LOAD_CACHE_ONLY
        }

        webView.settings.textZoom = zoom
        webView.loadUrl(url!!)
    }

    companion object {
        const val TAG : String = &quot;HomeFragment&quot;
    }
}" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">HomeFragment</span><span style="color: #D4D4D4"> : </span><span style="color: #4EC9B0">Fragment</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">lateinit</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">var</span><span style="color: #D4D4D4">  mySharedPrefs : </span><span style="color: #4EC9B0">MySharedPrefs</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">override</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">fun</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">onCreate</span><span style="color: #D4D4D4">(savedInstanceState: </span><span style="color: #4EC9B0">Bundle</span><span style="color: #D4D4D4">?) {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">super</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">onCreate</span><span style="color: #D4D4D4">(savedInstanceState)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">override</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">fun</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">onCreateView</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">        inflater: </span><span style="color: #4EC9B0">LayoutInflater</span><span style="color: #D4D4D4">, container: </span><span style="color: #4EC9B0">ViewGroup</span><span style="color: #D4D4D4">?,</span></span>
<span class="line"><span style="color: #D4D4D4">        savedInstanceState: </span><span style="color: #4EC9B0">Bundle</span><span style="color: #D4D4D4">?</span></span>
<span class="line"><span style="color: #D4D4D4">    ): </span><span style="color: #4EC9B0">View</span><span style="color: #D4D4D4">? {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">val</span><span style="color: #D4D4D4"> view = inflater.</span><span style="color: #DCDCAA">inflate</span><span style="color: #D4D4D4">(R.layout.fragment_home, container, </span><span style="color: #569CD6">false</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">initializeResource</span><span style="color: #D4D4D4">(view)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> view</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">fun</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">initializeResource</span><span style="color: #D4D4D4">(view : </span><span style="color: #4EC9B0">View</span><span style="color: #D4D4D4">){</span></span>
<span class="line"><span style="color: #6A9955">//        SharedPreferenceのインスタンス生成</span></span>
<span class="line"><span style="color: #D4D4D4">        mySharedPrefs = </span><span style="color: #DCDCAA">MySharedPrefs</span><span style="color: #D4D4D4">(context!!)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">//        データの取得</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">val</span><span style="color: #D4D4D4"> url = mySharedPrefs.</span><span style="color: #DCDCAA">getUrl</span><span style="color: #D4D4D4">()</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">val</span><span style="color: #D4D4D4"> cacheType = mySharedPrefs.</span><span style="color: #DCDCAA">getCache</span><span style="color: #D4D4D4">()</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">val</span><span style="color: #D4D4D4"> zoom = mySharedPrefs.</span><span style="color: #DCDCAA">getZoom</span><span style="color: #D4D4D4">()</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">//        WebViewの設定</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">val</span><span style="color: #D4D4D4"> webView = view.</span><span style="color: #DCDCAA">findViewById</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">WebView</span><span style="color: #D4D4D4">&gt;(R.id.webview)</span></span>
<span class="line"><span style="color: #D4D4D4">        webView.webViewClient = </span><span style="color: #DCDCAA">WebViewClient</span><span style="color: #D4D4D4">()</span></span>
<span class="line"><span style="color: #D4D4D4">        webView.settings.javaScriptEnabled = </span><span style="color: #569CD6">true</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">when</span><span style="color: #D4D4D4">(cacheType){</span></span>
<span class="line"><span style="color: #D4D4D4">            MySharedPrefs.CACHE_DEFAULT </span><span style="color: #569CD6">-&gt;</span><span style="color: #D4D4D4"> webView.settings.cacheMode = WebSettings.LOAD_DEFAULT</span></span>
<span class="line"><span style="color: #D4D4D4">            MySharedPrefs.NO_CACHE </span><span style="color: #569CD6">-&gt;</span><span style="color: #D4D4D4"> webView.settings.cacheMode = WebSettings.LOAD_NO_CACHE</span></span>
<span class="line"><span style="color: #D4D4D4">            MySharedPrefs.CACHE_ONLY </span><span style="color: #569CD6">-&gt;</span><span style="color: #D4D4D4"> webView.settings.cacheMode = WebSettings.LOAD_CACHE_ONLY</span></span>
<span class="line"><span style="color: #D4D4D4">        }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">        webView.settings.textZoom = zoom</span></span>
<span class="line"><span style="color: #D4D4D4">        webView.</span><span style="color: #DCDCAA">loadUrl</span><span style="color: #D4D4D4">(url!!)</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">companion</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">object</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">const</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">val</span><span style="color: #D4D4D4"> TAG : </span><span style="color: #4EC9B0">String</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&quot;HomeFragment&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p>　これで<span class="marker-under">設定画面でデータを変更し、タブ切り替えでホーム画面でウェブページが変更</span>されることが確認できると思います。実装の流れとしては以上になります。最後にできたアプリを確認してみましょう。</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-4-3 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="Androidアプリ開発 BottomNavigaitonViewとFragmentを利用したタブアプリケーション" width="1256" height="942" src="https://www.youtube.com/embed/NWYunr40AL4?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<h2 class="wp-block-heading">まとめ</h2>



<p>　今回はタブを利用して画面を切り替えるアプリの実装をしてみました。<span class="marker-under">BottomNavigationViewやWebView、SharedPreferencese、Fragmentなどは今後もよく利用するもの</span>ですので、ぜひ覚えておきましょう。<br>　プロジェクト一式は下記に配置してありますので、参考にしてください。</p>




<a rel="noopener" target="_blank" href="https://github.com/daichi-mizuno-tech/BottomNavigationApp" title="GitHub - daichi-mizuno-tech/BottomNavigationApp: BottomNavigationViewを利用したタブアプリケーション" class="blogcard-wrap external-blogcard-wrap a-wrap cf"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://opengraph.githubassets.com/aa117ae51cb2a16088432f67cc994a66687050e8cfdeaf1f739ae5edf4137037/daichi-mizuno-tech/BottomNavigationApp" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">GitHub - daichi-mizuno-tech/BottomNavigationApp: BottomNavigationViewを利用したタブアプリケーション</div><div class="blogcard-snippet external-blogcard-snippet">BottomNavigationViewを利用したタブアプリケーション. Contribute to daichi-mizuno-tech/BottomNavigationApp development by creating an acc...</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://github.com/daichi-mizuno-tech/BottomNavigationApp" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">github.com</div></div></div></div></a>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://techgrowup.net/android-fragment-tabapp/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【Android】フラグメント(Fragment)の基本とライフサイクル</title>
		<link>https://techgrowup.net/fragment-basic/</link>
					<comments>https://techgrowup.net/fragment-basic/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[techgrowup]]></dc:creator>
		<pubDate>Fri, 07 May 2021 16:35:30 +0000</pubDate>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[Androidアプリ開発]]></category>
		<category><![CDATA[Fragment]]></category>
		<guid isPermaLink="false">https://techgrowup.net/?p=361</guid>

					<description><![CDATA[はじめに 本記事ではAndroidアプリ開発におけるフラグメント(Fragment)の概念と、アプリ開発に重要なライフサイクル、実際にどうやって使うのか等を説明しています。 フラグメント(Fragment) フラグメント [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h1 class="wp-block-heading">はじめに</h1>



<p>本記事ではAndroidアプリ開発におけるフラグメント(Fragment)の概念と、アプリ開発に重要なライフサイクル、実際にどうやって使うのか等を説明しています。</p>



<p></p>



<h2 class="wp-block-heading">フラグメント(Fragment)</h2>



<h3 class="wp-block-heading">フラグメント(Fragment)とは</h3>



<p>　フラグメント(Fragment)とは<span class="marker-under">アプリUIの再利用可能な部分を作ることが出来る</span><span class="marker-under">ビュー</span>です。Activityと比較すると、フラグメント(Fragment)はそれぞれの細かな単位でのレイアウトを定義して管理することができます。以下Fragmentと呼びます。<br>　また、ライフサイクルも持ち合わせているため、様々な制御が可能であったり、入力イベントの処理も行うことができます。</p>



<p>　Fragmentの位置付けとしてはUIの部品なので、<span class="marker-under">常にActivityの子ビューとして構成する必要</span>があり、Fragment単体では表示することはありません。良く使われる例としては、以下の図の構成があげられます。</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="576" src="https://techgrowup.net/wp-content/uploads/2021/05/fragment-basic-example-structure-1024x576.png" alt="Fragmentを利用したアプリUIの構造" class="wp-image-373" srcset="https://techgrowup.net/wp-content/uploads/2021/05/fragment-basic-example-structure-1024x576.png 1024w, https://techgrowup.net/wp-content/uploads/2021/05/fragment-basic-example-structure-300x169.png 300w, https://techgrowup.net/wp-content/uploads/2021/05/fragment-basic-example-structure-768x432.png 768w, https://techgrowup.net/wp-content/uploads/2021/05/fragment-basic-example-structure-1536x864.png 1536w, https://techgrowup.net/wp-content/uploads/2021/05/fragment-basic-example-structure-120x68.png 120w, https://techgrowup.net/wp-content/uploads/2021/05/fragment-basic-example-structure-160x90.png 160w, https://techgrowup.net/wp-content/uploads/2021/05/fragment-basic-example-structure-320x180.png 320w, https://techgrowup.net/wp-content/uploads/2021/05/fragment-basic-example-structure.png 1920w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">Fragmentを利用したUIの例</figcaption></figure>



<p>　この例では、Activityという大きな枠に、「ホーム」ボタンと「設定」ボタンを配置しています。<br>「ホーム」ボタンと「設定」ボタンを押すと同時に、上部の「ホームFragment」と「設定Fragment」を切り替えるようなUIで、<span class="marker-under">各FragmentがActivityからは独立しているので、Fragmentという1つのUI部品を再利用したり、修正したりすることが</span>容易になります。<br>　また、Activityに依存していないため、複数のActivityから呼び出すことができます。そのため、再利用可能なコンポーネントにすることができます。<span class="marker-under">Activityで画面を作成した場合には、その画面は別のActivityでは利用できません</span>ので、Fragmentを利用するほうが汎用性が高まります。</p>



<h3 class="wp-block-heading">Fragmentのライフサイクル</h3>



<p>　続いてライフサイクルについて説明します。<br>前回Activityのライフサイクルについて説明しましたが、Activityと同様にFragmentもライフサイクルを持っており、<span class="marker-under">ライフサイクルを意識した開発をする</span>必要があります。<br>　※Activityのライフサイクルがわからない方は下記をご覧ください。</p>



<figure class="wp-block-embed is-type-wp-embed is-provider-techgrowth wp-block-embed-techgrowth"><div class="wp-block-embed__wrapper">

<a target="_self" href="https://techgrowup.net/2021/05/07/android-activity-lifecycle/" title="【Androidアプリ開発】アクティビティとライフサイクルの重要性" class="blogcard-wrap external-blogcard-wrap a-wrap cf"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://techgrowup.net/wp-content/uploads/2021/05/activity-lifecycle-icatch.png" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">【Androidアプリ開発】アクティビティとライフサイクルの重要性</div><div class="blogcard-snippet external-blogcard-snippet">Androidアプリ開発におけるActivityとライフサイクルの概念を説明しています。Androidアプリ開発ではライフサイクルを意識することで、高品質なアプリを作ることが出来ますので、必ず学んでください。</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://techgrowup.net/android-activity-lifecycle/" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">techgrowup.net</div></div></div></div></a>
</div></figure>



<p><br>　下記画像はGoogleが出している、Fragmentの公式ライフサイクル。詳しく見てみましょう。</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="317" height="847" src="https://techgrowup.net/wp-content/uploads/2021/05/fragment-basic-lifecyclepng.png" alt="Fragmentライフサイクル(公式)" class="wp-image-374" srcset="https://techgrowup.net/wp-content/uploads/2021/05/fragment-basic-lifecyclepng.png 317w, https://techgrowup.net/wp-content/uploads/2021/05/fragment-basic-lifecyclepng-112x300.png 112w" sizes="(max-width: 317px) 100vw, 317px" /><figcaption class="wp-element-caption">Fragmentのライフサイクル</figcaption></figure>



<p>　Activityと同じ部分コールバック関数は省略しますが、<span class="marker-under">Fragmentのライフサイクルで重要な点としてはonAttach(),onCreateView(),onActivityCreated(),onDestoyView(),onDetach()です</span>。<br>　Fragmentは前項で説明したように、単体で動作することはなく常にActivityの子ビューとして動作するため、AttachとDetach、英語を翻訳すると「付いた」「取り外された」という概念が存在します。</p>



<p>　Fragment自身からしてみれば、Activityに付けられた時点でUIが作成され、取り外された時点でUIを破棄しなければいけないので、破棄された時点でデータの保存や消去をしておく必要があります。下記は各コールバック関数の説明になります。</p>



<figure class="wp-block-table aligncenter"><div class="scrollable-table"><table><tbody><tr><td>onAttach()</td><td>ActivityによってFragmentが取り付けられた<br>タイミングで呼び出されるコールバック関数</td><td></td></tr><tr><td>onCreateView()</td><td>Fragment内のUIを描画するタイミングで<br>呼び出される関数</td><td></td></tr><tr><td>onActivityCreated()</td><td>Activity内のonCreate()が完了した際に呼び出される<br>コールバック関数</td><td></td></tr><tr><td>onDestoyView()</td><td>FragmentのUI(View)が破棄されたタイミングで<br>呼び出されるコールバック関数</td><td></td></tr><tr><td>onDetach()</td><td>ActivityによってFragmentが取り外された<br>タイミングで呼び出されるコールバック関数</td><td></td></tr></tbody></table></div><figcaption class="wp-element-caption">Fragmentのライフサイクル</figcaption></figure>



<p>　よく利用されるやり方としては、onCreate()でフラグメントのコンポーネントの初期化や設定値の初期化を行い、onCreateView()でUIを描画するためのViewを返します。その後、onPause()やonStop()でデータや設定値などを保存しておくのが良いです。</p>



<h3 class="wp-block-heading">FragmentManagerとは</h3>



<p>　<span class="marker-under">FragmentManagerとはその名通り、Fragmentを管理するためのクラスで、ActivityからFragmentの追加/削除/置換/バックスタックなどを検知し制御を行うためのクラス</span>です。</p>



<p>　応用例としては、Activityの子ビューとして Fragmentを使うだけでなく、Fragmentの子ビュー、つまり、Activity→Fragment→Fragmentのような構成も作ることが出来るため、この場合にはFragmentクラス内でFragmentManagerを呼び出すことが必要となります。</p>



<h3 class="wp-block-heading">FragmentTransactionとは</h3>



<p>　FragmentTransactionとは、FragmentManagerでは各Fragmentに対して管理が出来るのに対して、<span class="marker-under">FragmentTransactionは実際にActivityにFragmentを追加するためにcommit(コミット）を実行したり、Fragmentの入れ替えを行ったりすることが出来るクラス</span>です。</p>



<p>　使い方としてはFragmentTranasctionでFragmentを表示させたり、バックスタックに移動させたりして、FragmentManagerで状態を管理します。</p>



<h2 class="wp-block-heading">Fragmentの利用例</h2>



<h3 class="wp-block-heading">Fragmentの呼び出し</h3>



<p>　ここでは実際にActivityからどうやってFragmentを呼び出すかKotlinのソースコードを確認してみましょう。SampleFragmentというFragmentを作り、Activity内にcontainerというidのFrameLayoutを配置しています。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="supportFragmentManager.beginTransaction()
	.replace(R.id.container,SampleFragment())
	.setReorderingAllowed(true)
	.addToBackStack(&quot;name&quot;)
	.commit()" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">supportFragmentManager.</span><span style="color: #DCDCAA">beginTransaction</span><span style="color: #D4D4D4">()</span></span>
<span class="line"><span style="color: #D4D4D4">	.</span><span style="color: #DCDCAA">replace</span><span style="color: #D4D4D4">(R.id.container,</span><span style="color: #DCDCAA">SampleFragment</span><span style="color: #D4D4D4">())</span></span>
<span class="line"><span style="color: #D4D4D4">	.</span><span style="color: #DCDCAA">setReorderingAllowed</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">true</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">	.</span><span style="color: #DCDCAA">addToBackStack</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;name&quot;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">	.</span><span style="color: #DCDCAA">commit</span><span style="color: #D4D4D4">()</span></span></code></pre></div>



<p>　上記の例では、supportFragmentMangerでFragmentManagerクラスを呼び出し、beginTransaction()関数でFragmentTransactionを取得しています。その後、<span class="marker-under">replace関数でcontainerというidのFrameLayoutにSampleFragmentを配置</span>するという処理です。<br>　また、setReorderingAllowedはFragmentの状態変更を最適化するためのもので、addToBackStackではユーザーが「戻る」ボタンを押すことにより、1つ前のFragmentに戻ることができるようになる設定です。最後に、.commit()で上記の設定を実行しています。</p>



<h3 class="wp-block-heading">拡張できるサブクラス(DialogFragment,ListFragment)</h3>



<p>　Fragmentはそのものを拡張(extends)することができますが、<span class="marker-under">既に色々な用途で利用するための拡張クラスが用意されています</span>。今回はDialogFragmentとListFragmentを紹介します。<br>　ソースコードの無駄を減らしたり、開発期間を短縮するためには、できるだけ車輪の再発明はせず、既に利用できるものをどんどんつかっていきましょう！</p>



<h4 class="wp-block-heading">DialogFragment</h4>



<p>　<a rel="noopener" target="_blank" href="https://developer.android.com/reference/androidx/fragment/app/DialogFragment?hl=ja" data-type="URL" data-id="https://developer.android.com/reference/androidx/fragment/app/DialogFragment?hl=ja">DialogFragment<span class="fa fa-external-link external-icon anchor-icon"></span></a>とは、よくあるアプリであるような<span class="marker-under">警告画面やお知らせ画面などのダイアログを出すためのFragment</span>です。こちらを利用することダイアログのカスタマイズが簡単に行えるようになります。</p>



<h4 class="wp-block-heading">ListFragment</h4>



<p>　<a rel="noopener" target="_blank" href="https://developer.android.com/reference/androidx/fragment/app/ListFragment?hl=ja" data-type="URL" data-id="https://developer.android.com/reference/androidx/fragment/app/ListFragment?hl=ja">ListFragment<span class="fa fa-external-link external-icon anchor-icon"></span></a>とは、例えば<span class="marker-under">求人情報のリストや、動画リストなど様々なリストを作るためのFragment</span>で、リスト型のUIを利用するときは、このListFragmentをカスタマイズすると簡単に作れるようになります。</p>



<h3 class="wp-block-heading">FragmentとActivity間での通信</h3>



<p>　続いてFragmentとActivityの間でデータのやりとり（通信）を行う方法について説明します。例えばFragmentでユーザーが入力したユーザー情報を、Fragmentが破棄された後にもActivityでも利用したい場合などが挙げられます。<br>　このような場合に、<span class="marker-under">データや情報を渡すためにインターフェース(interface)を作りましょう。</span>インターフェース(interface)とはその名の通り、特定のコンポーネント同士の橋渡しになるような通り道/トンネルのようなものを作るための機能です。</p>



<p>　コードの書き方としては、FragmentとActivity側の両方に「データを送る処理」と「データを受け取る処理」を記述する必要があります。まずFragmentの方から見ていきましょう。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="var listener: OnInputUserNameListener? = null

interface OnInputUserNameListener {
        fun onInputUserName(name: String)
}" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> listener: </span><span style="color: #4EC9B0">OnInputUserNameListener</span><span style="color: #D4D4D4">? = </span><span style="color: #569CD6">null</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">interface</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">OnInputUserNameListener</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">fun</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">onInputUserName</span><span style="color: #D4D4D4">(name: </span><span style="color: #4EC9B0">String</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p>　上記の例では、ユーザー名を入力する時をイメージしており、OnInputUserNameListenerというインターフェイスを作成しています。このインターフェースの中にはonInputedUserNameという関数が用意されており、この<span class="marker-under">関数を実行することでインターフェースを通して情報を伝えることが可能</span>になります。　<br>　続いてonInputedUserNameを実行するために、ユーザーの名前を入力するときに、この関数を実行させます。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="listener?.onInputedUserName(&quot;なまえ&quot;)" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">listener?.</span><span style="color: #DCDCAA">onInputedUserName</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;なまえ&quot;</span><span style="color: #D4D4D4">)</span></span></code></pre></div>



<p>　最後に、Activity側でFragment内に作成した、OnInputUserNameListenerのインターフェースを継承(implements)して、onInputedUserNameコールバック関数を作成します。。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="override fun onInputedUserName(name: String) {
　　　　//Fragmentでユーザーの名前が入力されると、このコールバック関数が呼び出される
}" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">override</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">fun</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">onInputedUserName</span><span style="color: #D4D4D4">(name: </span><span style="color: #4EC9B0">String</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">　　　　</span><span style="color: #6A9955">//Fragmentでユーザーの名前が入力されると、このコールバック関数が呼び出される</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p>　このようにすると、<span class="marker-under">Fragment側でユーザー名をが入力された時に、onInputedUserName関数が実行され、それと同時にActivity側のonInputedUserNameコールバック関数も実行され、FragmentのデータをActivityに受け渡すことが可能になります</span>。<br>　</p>



<h2 class="wp-block-heading">まとめ</h2>



<p>　今回はFragmentの基本として、Fragmentの概念やライフサイクル、インターフェースを作成したデータの受け渡し方法などを説明しました。</p>



<p><br>　今までの知識を利用して、下記記事では実際にFragmentを利用したタブアプリケーションの実装を説明しています。、一般的によくあるタブ付きのアプリで画面の切り替えや、ライフサイクルを意識したアプリを作ってみたいと思います。</p>



<figure class="wp-block-embed is-type-wp-embed is-provider-techgrowup wp-block-embed-techgrowup"><div class="wp-block-embed__wrapper">

<a target="_self" href="https://techgrowup.net/2021/05/08/android-fragment-tabapp/" title="【Androidアプリ開発】タブで画面を切り替えるアプリの実装" class="blogcard-wrap external-blogcard-wrap a-wrap cf"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://techgrowup.net/wp-content/uploads/2021/05/fragment-app-icatch.png" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">【Androidアプリ開発】タブで画面を切り替えるアプリの実装</div><div class="blogcard-snippet external-blogcard-snippet">Andriodアプリ開発におけるタブで画面を切り替えるアプリの実装方法を説明しています。タブを利用することで複数の画面を行き来し、ユーザーにとって分かりやすく使いやすいアプリを作ることが出来ますので、学んでみましょう。</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://techgrowup.net/android-fragment-tabapp/" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">techgrowup.net</div></div></div></div></a>
</div></figure>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://techgrowup.net/fragment-basic/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【Androidアプリ開発】アクティビティとライフサイクルの重要性</title>
		<link>https://techgrowup.net/android-activity-lifecycle/</link>
					<comments>https://techgrowup.net/android-activity-lifecycle/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[techgrowup]]></dc:creator>
		<pubDate>Fri, 07 May 2021 07:12:07 +0000</pubDate>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[Activity]]></category>
		<category><![CDATA[Androidアプリ開発]]></category>
		<category><![CDATA[ライフサイクル]]></category>
		<guid isPermaLink="false">https://techgrowth.xsrv.jp/wp/?p=77</guid>

					<description><![CDATA[はじめに 　本記事ではAndroidアプリ開発における、重要な概念の一つであるライフサイクルについて、アクティビティ（Activity)を例にして説明していきます。 アクティビティ（Activity)とは アクティビティ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h1 class="wp-block-heading">はじめに</h1>



<p>　本記事ではAndroidアプリ開発における、重要な概念の一つであるライフサイクルについて、アクティビティ（Activity)を例にして説明していきます。</p>



<p></p>



<h2 class="wp-block-heading">アクティビティ（Activity)とは</h2>



<h3 class="wp-block-heading">アクティビティ（Activity)について</h3>



<p>　Androidアプリ開発における<span class="marker-under">アクティビティ（以下Activity)とは、「Androidアプリの画面」</span>のことを指しています。通常皆さんがアプリを開くときは、アプリアイコンなどを押した後に画面が開き、ボタンを押したり入力などを行うと思います。その時にボタンやテキストボックスが置かれている<span class="marker-under">画面そのものを1つのActivity</span>として理解してください。<br>　多くのアプリでは画面は1つではなく複数の画面から成り立っていることが多く、その場合にはActivityも複数になります。<br>　※Androidアプリ開発では１つのActivityに対してFragment（フラグメント）を利用して複数画面を作成する方法もありますので、詳しくは以下を参照してください。</p>



<figure class="wp-block-embed is-type-wp-embed is-provider-techgrowup wp-block-embed-techgrowup"><div class="wp-block-embed__wrapper">

<a target="_self" href="https://techgrowup.net/android-fragment-tabapp" title="【Androidアプリ開発】タブで画面を切り替えるアプリの実装" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="160" height="90" src="https://techgrowup.net/wp-content/uploads/2021/05/fragment-app-icatch-160x90.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://techgrowup.net/wp-content/uploads/2021/05/fragment-app-icatch-160x90.png 160w, https://techgrowup.net/wp-content/uploads/2021/05/fragment-app-icatch-120x68.png 120w, https://techgrowup.net/wp-content/uploads/2021/05/fragment-app-icatch-320x180.png 320w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【Androidアプリ開発】タブで画面を切り替えるアプリの実装</div><div class="blogcard-snippet internal-blogcard-snippet">Andriodアプリ開発におけるタブで画面を切り替えるアプリの実装方法を説明しています。タブを利用することで複数の画面を行き来し、ユーザーにとって分かりやすく使いやすいアプリを作ることが出来ますので、学んでみましょう。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://techgrowup.net" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">techgrowup.net</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2024.10.29</div></div></div></div></a>
</div></figure>



<h3 class="wp-block-heading">アプリ画面の構成</h3>



<p>　ここで画面を作成する時の構成を見てみましょう。</p>



<figure class="wp-block-image aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="826" src="https://techgrowup.net/wp-content/uploads/2021/05/activity-lifecycle-app-structure-1024x826.jpg" alt="アプリの構成" class="wp-image-341" style="aspect-ratio:512/413" srcset="https://techgrowup.net/wp-content/uploads/2021/05/activity-lifecycle-app-structure-1024x826.jpg 1024w, https://techgrowup.net/wp-content/uploads/2021/05/activity-lifecycle-app-structure-300x242.jpg 300w, https://techgrowup.net/wp-content/uploads/2021/05/activity-lifecycle-app-structure-768x620.jpg 768w, https://techgrowup.net/wp-content/uploads/2021/05/activity-lifecycle-app-structure-1536x1240.jpg 1536w, https://techgrowup.net/wp-content/uploads/2021/05/activity-lifecycle-app-structure.jpg 1690w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">アプリの構成</figcaption></figure>



<p>　Activityは様々な要素を持っており、<span class="marker-under">画像のステータスバーやアクションバーなどの制御も可能</span>になります。また、アプリとして必要な<span class="marker-under">ボタンやテキストボックスなどの要素（ビュー）もActivity内部に配置</span>することができるます。</p>



<p>　プロジェクト内でのActivityの作り方については下記ページを参考に作成してみてください。</p>



<figure class="wp-block-embed is-type-wp-embed is-provider-techgrowup wp-block-embed-techgrowup"><div class="wp-block-embed__wrapper">

<a target="_self" href="https://techgrowup.net/android-app-easyinterface/#toc7" title="【Androidアプリ開発】簡単な画面遷移アプリを作成する" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="160" height="90" src="https://techgrowup.net/wp-content/uploads/2021/05/create-app-transition-app-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://techgrowup.net/wp-content/uploads/2021/05/create-app-transition-app-160x90.jpg 160w, https://techgrowup.net/wp-content/uploads/2021/05/create-app-transition-app-120x68.jpg 120w, https://techgrowup.net/wp-content/uploads/2021/05/create-app-transition-app-320x180.jpg 320w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【Androidアプリ開発】簡単な画面遷移アプリを作成する</div><div class="blogcard-snippet internal-blogcard-snippet">Androidアプリ開発を始めて間もない方に向けて、簡単な画面遷移アプリを作成する記事となっています。アプリにおいて画面遷移は必ず必要な要素ですので、ぜひ学習しましょう。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://techgrowup.net" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">techgrowup.net</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2024.10.29</div></div></div></div></a>
</div></figure>



<h3 class="wp-block-heading">AndroidManifest.xmlへの宣言</h3>



<p>　Activityを利用するときには、<span class="marker-under">AndroidManifest.xmlへ宣言（定義）する必要</span>があります。これはアプリがどんなActivityを持っていて、どんな設定がされているかを認識するためです。例としてデフォルトで作成されるMainActivityの&lt;acitivty&gt;タグを見てみましょう。</p>



<pre class="wp-block-code xml"><code>        &lt;activity android:name=".MainActivity"&gt;
            &lt;intent-filter&gt;
                &lt;action android:name="android.intent.action.MAIN" /&gt;

                &lt;category android:name="android.intent.category.LAUNCHER" /&gt;
            &lt;/intent-filter&gt;
        &lt;/activity&gt;</code></pre>



<p>name属性として.MainActivityと記述されていますが、これはMainActivity.ktクラスを指しています。また、intent-filterというタグがあると思いますが、こちらはaction, category, dataという属性を追加することができます。各要素についての説明は下記です。</p>



<figure class="wp-block-table aligncenter"><div class="scrollable-table"><table><tbody><tr><td>タグ名</td><td>説明</td></tr><tr><td>intent-filter</td><td>アクティビティのインテントフィルタを定義するためのもの。<br>アクティビティが受け入れるアクションやデータのタイプを<br>action,category,dataとして定義する。</td></tr><tr><td>action</td><td>実行するアクション名を示す文字列。上記コードの例では<br>ACTION_MAINというアプリを開いたときの初期Activity(画面）として定義するものです。<br>その他にもACTION_SENDのようなインテントで<br>他のアプリにデータを受け渡すために使うものや、ACTION_VIEWなどが存在します。</td></tr><tr><td>category</td><td>インテントを処理するアクティビティの性質（通常はユーザー ジェスチャーや<br>アクションが開始された場所に関連）を示すものです。<br>上記コードの例のcategory.LAUNCHERはホームボタンから起動できる画面としての定義です。</td></tr><tr><td>data</td><td>インテントに関連付けられるデータを指定します。<br>例えば&#8221;scheme&#8221;,&#8221;host&#8221;,&#8221;port&#8221;,&#8221;path&#8221;,”mimeType&#8221;などを指定することができ、android:scheme=&#8221;http&#8221;のように指定します。</td></tr></tbody></table></div><figcaption class="wp-element-caption">タグの説明</figcaption></figure>



<p>　Intentについての説明は下記にまとめてあります。</p>



<figure class="wp-block-embed is-type-wp-embed is-provider-techgrowup wp-block-embed-techgrowup"><div class="wp-block-embed__wrapper">

<a target="_self" href="https://techgrowup.net/android-intent" title="【Androidアプリ開発】Intentとは、Intentの使い方とは。" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="160" height="90" src="https://techgrowup.net/wp-content/uploads/2021/05/intent-icatch-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://techgrowup.net/wp-content/uploads/2021/05/intent-icatch-160x90.jpg 160w, https://techgrowup.net/wp-content/uploads/2021/05/intent-icatch-120x68.jpg 120w, https://techgrowup.net/wp-content/uploads/2021/05/intent-icatch-320x180.jpg 320w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【Androidアプリ開発】Intentとは、Intentの使い方とは。</div><div class="blogcard-snippet internal-blogcard-snippet">Androidアプリ開発における、Intentについての概要を説明し、実際の使い方についてコード例を交えながら解説しています。画面遷移やService,Broadcast配信などに利用される重要な概念ですので、ぜひ学びましょう。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://techgrowup.net" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">techgrowup.net</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2024.10.31</div></div></div></div></a>
</div></figure>



<p></p>



<h2 class="wp-block-heading">Activityのライフサイクル</h2>



<h3 class="wp-block-heading">ライフサイクルとは</h3>



<p>　Androidアプリ開発では<span class="marker-under">ライフサイクルを意識して開発することが特に重要</span>で、例えば「アプリを利用している時に電話が掛かってきた場合」や「アプリ利用中に電源ボタンを押してスリープになった場合」などに、アプリがクラッシュするようでは良いアプリとは言えません。<br>　ライフサイクルとはActivityやFragment(フラグメント）がどのように生まれて、どのように破棄されるのかをサイクルとして定義しているものになります。<span class="marker-under">ライフサイクルを考慮することによって、アプリが一時的に止まった時や再開した時に復帰できるように処理を作ることができます</span>。</p>



<h3 class="wp-block-heading">Activityのライフサイクルの種類</h3>



<p>　Googleが公式で出している、Activityのライフサイクルの流れを見てみましょう。</p>



<figure class="wp-block-image aligncenter size-large is-resized"><img decoding="async" src="https://techgrowup.net/wp-content/uploads/2021/05/activity-lifecycle-structure.png" alt="Activity ライフサイクル図" class="wp-image-342" style="aspect-ratio:385/497"/><figcaption class="wp-element-caption">Activityのライフサイクル</figcaption></figure>



<p>　Activityが始まってから、終了するまでの一連の流れが示されています。続いて、たくさんの項目がありますが、各項目について表にまとめます。</p>



<figure class="wp-block-table aligncenter"><div class="scrollable-table"><table><tbody><tr><td>項目</td><td>説明</td><td>利用用途</td></tr><tr><td>onCreate()</td><td>Activityが作成された時に呼び出されるコールバック<br>全てのActivityで必ず呼び出す必要があり、1回だけ呼び出されます。</td><td>Activityが開始する時に呼び出されるため、<br>レイアウトの設定(setContentView）などに利用されます。</td></tr><tr><td>onStart()</td><td>Activityが開始状態になると呼び出されるコールバック<br>開始状態はバックグラウンド状態から復帰した（フォアグラウンドに戻る）ときや<br>Activityの開始時に相当します</td><td>Activityの開始時に、レイアウトを初期化しておきたいときや、<br>ユーザー操作させるための設定に変更させる場合に利用します。</td></tr><tr><td>onResume()</td><td>Activityが再開状態になったときに呼び出されるコールバック<br>堺状態は他のActivityから戻ってきたときや電話の着信から戻った時に相当します</td><td>他の画面から戻ってきた時にUIを変更したり、<br>端末のスリープから復帰した時に正常なアプリ動作に戻す時などに利用されます。</td></tr><tr><td>onPause()</td><td>Acitivtyが停止状態になったときに呼び出されるコールバック<br>停止状態は他のActivityに移った時や、<br>電話の着信時などの一時的にActivityが非表示状態になったときに相当します</td><td>Activityが非表示になった時に保持して起きたいUIや設定値の保存などに利用されます。<br>onPause()は短時間で終了してしまうため、<br>データベースの保存などは利用してはいけません。</td></tr><tr><td>onStop()</td><td>Activityが表示されなくなった時に呼び出されるコールバック<br>他のアプリが使用されるようになった場合などが該当します</td><td>データベースへ値を保存するときなどに利用します。</td></tr><tr><td>onDestoy</td><td>Activityが破棄される前に呼び出されるコールバック<br>ユーザーが完全にアプリを閉じたり、画面の向きを変えたりすると、<br>Activityが破棄されるため、このコールバックが呼び出されます。</td><td>再度Activityが開いた時に、onCreateからライフサイクルが始まっても、アプリとして正しく機能するように<br>保存しておく状態やデータを全て記録するために利用します。</td></tr></tbody></table></div><figcaption class="wp-element-caption">Activityライフサイクルの説明</figcaption></figure>



<h2 class="wp-block-heading">ライフサイクルの動作確認</h2>



<p>　実際にActivity内のライフサイクルがどのように動いているか、ソースコードを書いて確認してみましょう。今回はライフサイクルのonCreate、onStart()、onResume()、onPause()、onStop()、onDestroy()の6種類のコールバック関数に、ログを入れてアプリを動かしながら確認します。<br>　下記コードをMainActivityに記述しましょう。</p>



<pre class="wp-block-code"><code>    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        Log.d("MainActivity","onCreate")
    }

    override fun onStart(){
        super.onStart()
        Log.d("MainActivity","onStart")
    }

    override fun onResume(){
        super.onResume()
        Log.d("MainActivity","onResume")
    }

    override fun onPause(){
        super.onPause()
        Log.d("MainActivity","onPause")
    }

    override fun onStop(){
        super.onStop()
        Log.d("MainActivity","onStop")
    }

    override fun onDestroy(){
        super.onDestroy()
        Log.d("MainActivity","onDestroy")
    }</code></pre>



<p>　Log.dというのはログをデバッグとして出力するための関数です。<br>　※Android Studioでログを確認するにはLogcatウィンドウを開きます。<span class="marker-under">詳しくは動画を御覧ください。</span></p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-4-3 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="Androidアプリ開発　Activityライフサイクル確認" width="1256" height="942" src="https://www.youtube.com/embed/OnR2NfAa9ao?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<p>　いかがでしょうか。アプリが「開く」、「閉じる」、「バックグラウンドに移る」などの動作によって、Activityのライフサイクルが変わることがLogcatで確認できましたでしょうか。<br>　<span class="bold-red">どのAndroid端末でも、Activityのライフサイクルは同じですので、必ず覚えてください。</span>また、ActivityではなくFragment(フラグメント）の場合だとライフサイクルは変わりますので、<span class="marker-under">Androidアプリ開発ではライフサイクルを意識することが大切</span>ということを覚えておきましょう。<br>　Fragment(フラグメント）のライフサイクルについては下記を見てみてください。</p>



<figure class="wp-block-embed is-type-wp-embed is-provider-techgrowup wp-block-embed-techgrowup"><div class="wp-block-embed__wrapper">

<a target="_self" href="https://techgrowup.net/fragment-basic/#toc3" title="【Android】フラグメント(Fragment)の基本とライフサイクル" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="160" height="90" src="https://techgrowup.net/wp-content/uploads/2021/05/fragment-basic-icatch-160x90.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://techgrowup.net/wp-content/uploads/2021/05/fragment-basic-icatch-160x90.png 160w, https://techgrowup.net/wp-content/uploads/2021/05/fragment-basic-icatch-120x68.png 120w, https://techgrowup.net/wp-content/uploads/2021/05/fragment-basic-icatch-320x180.png 320w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【Android】フラグメント(Fragment)の基本とライフサイクル</div><div class="blogcard-snippet internal-blogcard-snippet">Androidアプリ開発におけるフラグメント（Fragment)の概念やライフサイクルを意識した使い方を説明しています。フラグメント（Fragment)はUIを作る上で再利用可能に出来る有用なコンポーネントなので、ぜひ学びましょう。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://techgrowup.net" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">techgrowup.net</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2024.08.24</div></div></div></div></a>
</div></figure>



<h2 class="wp-block-heading">まとめ</h2>



<p>　今回はActivity（アクティビティ）についてと、Activity(アクティビティ）におけるライフサイクルについて説明しました。<span class="marker-under">Androidアプリ開発では特に重要な概念ですので、必ず覚えてください。</span></p>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://techgrowup.net/android-activity-lifecycle/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin

Disk: Enhanced  を使用したページ キャッシュ

Served from: techgrowup.net @ 2026-04-15 05:04:55 by W3 Total Cache
-->