F吉の蓄積

記憶力の良くない学生の知識の保管。初歩的なITとか株とか

【Android】contextとは?

もっと詳しく分かってきたら後々追記する。

 

【概要】

・アプリ全体の状態を持っていて、何から起動されたかどういう状態か、何にアクセスしようとしているか、といった情報を受け渡すために使っている。

・アプリ全体の情報を統括してる

直訳すると「文脈、脈絡」。…?とにかく、アプリの情報を持ってるヤツらしい。

Androidアプリを作ってるとやたら引数で呼ばれるのは「分からないことは俺に聞け!」っていうスゴイやつだからなのかな。

 

【contextには2種類ある】

Activityのcontext(使い方:Activity名.this)

 Activityのライフサイクルに依存。基本Activityが破棄される時に一緒に破棄されるが、静的な変数がcontextを参照してる場合、contextのメモリが開放されずメモリリークする可能性がある。

Applicationのcontext(使い方: getApplicationContext()) 

  アプリケーションに依存。アプリケーションが生きている限り生き続ける。上に挙げた、静的な変数が参照するcontextはこっちがいい。

 

 ※参考サイト様

AndroidのContextについて:とあるフリーランスエンジニアの拡張現実 - ブロマガ

Contextとは? - 整理できない底辺プログラマのメモブログ

 

AndroidのServiceについて(1)

使用前にサイト読み漁って分かったことまとめ。

【概要】
・常駐アプリを作成するためのクラス
・開始すると、明示的に終了されるまで動き続ける(アクティビティが死んでも)

【使用例】
・音楽再生アプリ
・タイマー

【ギモン】
Serviceに見た目を持たせる(他のアプリ起動してもそれより前面に画像表示させとくみたいな)
のってどうするの?xmlでレイアウトファイル作ればいいの?

これから実際に使ってみる。

【Java】クラス生成時の変数はオブジェクトを指すアドレス

ClassX obj1 = new ClassX();

ClassX obj2 = new ClassX();

このようにクラスのオブジェクトを生成すると、ClassXオブジェクトの領域が確保され、obj1,2にはそれぞれの領域を指す参照値(アドレス)が入る

f:id:fkichi:20170305143708p:plain

変数obj1にobj2を代入してみる。

obj1 = obj2;

 これを行うとobj1はobj2と同じ領域を参照するようになる。

f:id:fkichi:20170305145901p:plain

(誰にも参照されなくなった一つ目のClassX領域はガベージコレクション機能で自動的に解放される)

 

例えばメソッドの引数としてクラスのオブジェクトを渡すことを考えてみる。

public static void main(String[] args){

          ClassX obj1 = new ClassX();

          methodX(obj1);

}

void methodX(ClassX obj){

          ClassX obj2 = new ClassX();

          obj2 = obj1;

          //処理

}

methodXで作成したobj2はobj1と同じ領域を参照するようになったので、このメソッド内でobj2のメンバを書き換えたりするとobj1のメンバも同じように書き換わる(ように見える)。

配列の参照渡しと同じ考え方ですね。ちなみにJavaでは配列とクラスオブジェクトだけが参照渡しらしい(String除く)。

 

Javaで「参照渡し」という呼び方は適切じゃないみたいです。まあそのへんの詳しいところはちょっと後回しにします…。

qiita.com

extends?implements?(class?interface?)

 https://oshiete.goo.ne.jp/qa/111300.html

教えて!gooにめっちゃ分かりやすい回答があった。

 ・extendsとimplementsの違いは?

classを引き継ぐのがextends(継承)
interfaceを実装するのがimplements(実装)

 

 ・じゃあclassとinterfaceの違いは?

クラスは実体を持てる。つまりインスタンスを生成できる。
インターフェースは実体を持てない(抽象メソッドしか持たない)。
→implementsによって「実装」してやらないと使えない

 

・実体を持てないインターフェースって別にいらなくない?クラスでよくない?
割とその通り。けどJavaでは複数のクラスを引き継げないからどうしようってことで作られたのが「インターフェース」。
複数のクラスを引き継ぐことはできないけど、引き継ぎ(extends)と実装(implements)は同時にできる。複数のインターフェースをimplementsすることもできる。

 

・インターフェースのメリットそれだけ?
オブジェクト指向の原則の一つ「カプセル化」のために必要なものらしい。
カプセル化…データ構造の内部の情報を外部から直接参照できないようにし,
代わりにデータ操作のためのインターフェースを外部に提供すること。)
つまりインターフェースを実装(implements)したクラスのメソッドはprivateで隠し、
中身のない(抽象メソッドだから)インターフェースだけ外部に見せる(こういう機能もってるよ~)ってこと?

こういう概念とか設計思考的なものは実際にプログラム組まないと本当に理解することはできないんだろーな。

テキストファイルからJSON形式への変換

a.txt

http://abc.com/def.jpg
http://abc.com/ghi.jpg
http://abc.com/jkl.jpg

このテキストファイルを

b.json

[

     "http://abc.com/def.jpg",

     "http://abc.com/ghi.jpg",

     "http://abc.com/jkl.jpg"

]

のようにJSON形式に変換する方法。テキストを一度配列にいれてJSONエンコードする。

 

①テキストを配列に入れる

$image_array = array();                          //配列

$textfile = file_get_contents('a.txt');          //テキストファイルの中身を全て文字列として読み込む

$image_array = explode("\n",$textfile);     //文字列を改行で分割し配列にいれる

explodeは第二引数の文字列を第一引数で指定した文字で区切って配列として返してくれる。a.txtでは画像のURLを改行で区切って保存してあるので、第一引数に改行("\n")を指定する。

 

②配列をJSONエンコードする

あとは

json_encode($image_array,JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT);

json_encodeで配列からJSONに変換する。

このブログについて

アイドル (欅坂46)好き、将来はIT業界に入ろうとしている学生のブログです。

最近本格的にプログラミングをやりはじめたのですが分からない事だらけで調べものが多く、折角調べても忘れてしまうことが多々あることからブログとして残すことにしてみました。

僕の最大のモチベーションである欅坂46についてもちょくちょく話そうかなと、思っています。!