Android: Activity以外からActivityを起動させる

今ちょっと実験的にアプリ作ってみようかなと思って3時間ほど頑張ってみたのですが、どうも需要がなさそうなアプリになりそうなので開発中止かな〜という感じです…。まあその過程で、得られた知識がありましたので、公開しておきます。Activity以外からActivityを呼ぶ方法です。具体的にはRecieverからActivityを起動したり、ServiceからActivityを起動したりする方法になるかと。

Activityから、次の画面用のActivityを呼ぶ場合は startActivity(intent); をすればいいわけですが、今回はアプリの都合上、レシーバからActivityを起動しようとしました。すると、例外で怒られました。

Caused by: android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?

なんか、最後の英語が「一体あんたはなにがしたいの?」みたいな感じがして心にグサッと刺さった(「やりたいことはホントはこれじゃないの?」じゃないかとtwitterで ryosms さんからツッコミががが…英語力のなさを露呈…)のですが、FLAG_ACTIVITY_NEW_TASKというフラグを設定すれば動きそうです。

サンプルを書いておきます。
intentのアクション名は適当に考えたやつです。
普通には存在しないパラメータなのでご注意を。

// サービス内でレシーバを定義
BroadcastReceiver mReceiver = new BroadcastReceiver() {
   	
	@Override
	public void onReceive(Context context, Intent intent) {
		String action = intent.getAction();
		Intent new_intent;
		if (action.equals("jp.cyclemate.Test.LOCK_MONITOR")) {
			new_intent = new Intent(context, NotOperation.class);
			// Activity以外からActivityを呼び出すためのフラグを設定
			new_intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
			startActivity(new_intent);
		}
	}
};

以上です。


日記:エンジニアとして競争力を高めるには

エンジニアが競争力を高めようと思ったら、品質が同じであると仮定すると、製作時間を短くすることになります。開発コストを抑えることで、競争力を高めようというわけです。多少高くても、早く出来上がるのであれば喜んで投資するというお客様はいらっしゃると思います。いうなればお金で時間を買うというやつです。

前々から言っているのですが、IT業界の仕事は時給で考えにくいので、成果報酬制度がいいと思うのですが、そうなると今度はその成果報酬をどう見積もるかが難しい。ただ時給制だと腕の悪いプログラマが大勢集まってダラダラと作っているような企業が儲かるという仕組みになってしまうんじゃないの?と思う訳です。まぁそういうところは価格競争力が低いから淘汰されていくとは思うのですが、もし自分達がその立場だったらどーよ?どう改善していくのがいいのよ?ということです。

自分はオープンソースのフレームワークを採用し、その資産・ノウハウを再利用することで開発コストの削減と、オープンソースフレームワークを使うようなデキル人材の発掘こそが重要である(人材育成コスト下がるし、そういう人は放っておいても伸びる人なので)と会社でずっと言い続けていたのですが、周囲にはなかなか興味をもってもらえず(もしくは頭では理解できるけれど行動が伴わない)、ジョエル本だかにあったように自分は粛々とやりつづけていました。まぁ会社でも家でもプログラムやり続けるってのは、家庭がある人には難しいところがあるだろうから、仕方がないのかなとは思うのですが(私は独身なので基本もくもくとコード書いたり、本読んだりし続ける。まぁそれが楽しいので)。

技術的視点で競争力を高めることは、必ずお客様のためにもなるので(低価格、短納期でよいものを提供できるようになるから)、いつも念頭におくべき課題であると思います。勉強するのは自分のためや会社のためでもあるけれど、お客様のためであるという意識を持っておくと、やる気が湧いていいと思う。喜んでもらえたらまたやる気が出てくるし。

ただ最新の技術に飛びつけって言っているわけではなく、オープンな技術のノウハウを蓄積しつつ前進してあわよくば新しい技術も覚えながら成長しろと。ノウハウを溜めてこそ、フレームワークの恩恵が得らるようになるし、それを以てお客様のために力になれる。少しずつでもいいから、オリジナルのノウハウを蓄積/できれば公開を繰り返せば、おのずと競争力・信用力は高まっていくと思います。ノウハウが溜まらないうちから、すぐ結果を求めるのはただのバカだと自戒の念を込めて記します。

さー、寝よう!!


Android: Android勉強会@愛媛 2回目やりました!

昨日、Android勉強会@愛媛 2回目をやりました。
開発者が集まってアプリ作ったり色んな話しようぜって感じの集まりです。

場所は私の家。今回の参加者は4人でした。

テーマを決めて「これをやります!」という集まりではないので、緩い感じがいいです。

自分は今回はスライドショーアプリを作っている最中なので、スライドショーの実装をやってました。今、写真アプリなどを扱う場合のための個人用ライブラリを作っている最中なので、抽象クラスのスライドショー用Activityを継承してやるという実験。結果はうまくいったので、スライドショー作るのはこれでかなり楽になりそう!

次に、GridViewを使った画像一覧表示。間違えて、でかい画像を大量に読み込もうとしていたため、Out Of Memoryが出続けているのに気付かずにいました…。画像サイズを小さくしたら、普通に表示されたため、これもあっさりと解決。しょうもないことでハマって時間使っちゃってタイムアップでした(^^;)

今回、stachibana さんに教えてもらったAdobe Airで作られている縮小専用というアプリがものすごくよかったです!ドラッグ&ドロップした画像の大きさを全て揃えてくれるというアプリ。Adobe Airのアプリなので、Win, Mac, Linux問わず使えるっぽいです。GridViewやGallery使うようなアプリだったら必須になりそう。

懇親会をうちの近くの居酒屋に行って行ったのですが、そのときにも個人個人の得意分野とかがわかって、これまた新しいコラボレーションが生まれるのではないかという予感があります。なんだかんだで個人だけの力でやるのは、苦手分野に時間を取られ過ぎたり(しかも苦手なので完成度は低い…)、途中でやる気が萎えてしまったりするので、開発者・デザイナーが得意分野で作業分担しながら一つの作品を作り上げるほうがやっぱり理想的だなぁと思います。もし収益が発生する場合は、公平にわけて。

また来月も行いたいと思いますので、ぜひご参加ください!!


Android: TableLayoutで指定列を可変長にする方法

TableLayoutでハマったのでメモとして残しておきます。
本でもあんまりTableLayoutって見かけない気がする。
HTMLのテーブルほど利便性があるわけではないけど、
項目の頭を合わせることができるのが便利な点。

でもなんだか使いにくい。まぁちゃんとリファレンス読めよという話なのかもしれないけれど。

やりたかったことは、

  • 3列の2列目のTextViewを可変長にする
  • 3列の2列目のTextViewに入る内容が長くてもレイアウト崩れないようにする

です。

2列目を可変長にすればいいだからと思って、TableLayoutのリファレンスを大して読まずに2列目のTextViewにandroid:Layout_weight=”1″を設定すればいいんだろうと思ってたのがで大間違い。既存のリリースでは解決方法がわからなかったので、Layout_widthに固定長の値を入れてなんとかしていたのですが、Desireが2.2になったら明らかにレイアウトが崩れていたのでなんとかせねばと。

twitterでTableLayoutわかんねー!ってぼやいていたら、ryosmsさんにTableLayoutのandroid:strechColumnsの存在を教えてもらいました。さすが瀬戸デ部メンバー!ありがたい!!指定した列のカラムが自動で最大長になってくれるという属性らしいっす。これがLayout_weightの代わりになってくれそう。で、これだけ指定したら、2列目の内容が長過ぎる場合に3列目が画面外に追いやられてしまいました…。

このあと、指定したカラムの内容を縮小して表示するという属性があることを知り、それを該当カラムに適用するように書いたらうまくいきました。android:shrinkColumnsです。適用させたいカラムをカンマ区切りの数字で指定するらしいです。*を指定すると全部の行に適用になります。

あと、カラムの間隔をmargin使って制御しようとすると、strechColumnsと喧嘩するので、paddingを使ってます。

実際に使ってるソースの一部を切り出してます。
注目するべきはTableLayoutのandroid:shrinkColumnsとandroid:strechColumnsのみなので、あとはオマケみたいなもんです。

<TableLayout android:layout_height="wrap_content"
	android:layout_width="fill_parent"
	android:shrinkColumns="1"
	android:stretchColumns="1">
	<TableRow android:layout_height="wrap_content"
		android:layout_width="fill_parent" android:id="@+id/rowSearchByMap">
		<TextView 
			android:layout_width="wrap_content" 
			android:layout_height="wrap_content" 
			android:text="@string/lbl_map"
			android:layout_gravity="left|center_vertical"
			android:paddingRight="5dp" />
		<TextView 
			android:layout_width="wrap_content" 
			android:layout_height="wrap_content" 
			android:id="@+id/txtAdress" 
			android:layout_gravity="left|center_vertical" 
			android:text="@string/txt_no_setting"
			 />
		<ToggleButton 
			android:text="@+id/ToggleButton01"
			android:layout_width="wrap_content" 
			android:layout_height="wrap_content"
			android:layout_gravity="right|center_vertical"
			android:id="@+id/toggleMap"/>
	</TableRow>
	<TableRow android:layout_height="wrap_content" android:id="@+id/rowSearchByDate"
		android:layout_width="fill_parent">
		<TextView android:layout_width="wrap_content"
			android:layout_height="wrap_content" android:text="@string/lbl_date"
			android:layout_gravity="left|center_vertical" android:paddingRight="5dp" />
		<TextView 
			android:layout_width="wrap_content" 
			android:layout_height="wrap_content" 
			android:id="@+id/txtSearchByDate" 
			android:layout_gravity="left|center_vertical" 
			android:text="@string/txt_no_setting"
			 />
		<ToggleButton android:text="@+id/ToggleButton02"
			android:layout_width="wrap_content" android:layout_height="wrap_content"
			android:layout_gravity="right|center_vertical" android:id="@+id/toggleDate" />
	</TableRow>
</TableLayout>

これで、2列目が可変長になり、2列目の内容が長かったとしても自動で改行してくれるようになりました。めでたしめでたし。


日記:一人カラオケなど

今日は久々に一人カラオケしてきた。1年ぶりくらいだろうか?
そしてDesireがあるので、一人カラオケをUstreamで配信してみた。
我ながら恐ろしい試みであった。
まぁリスナーはほとんどいなかったので、
あんまり気にもならなかった訳ですがw

ほとんどTHE BOOMの歌ばっかり歌ってた。
あとちょっとだけ福山雅治。

しかも、動画を保存したので、あとで自分の歌声を確認してみたのだが、やっぱり自分で自分の声を聞くと妙な感じがする(笑)だいたいみんなそうだろうと思うけども。動画は自分で見た後に、(あまりに恥ずかしかったので)消しておきました(笑)

一人カラオケは気兼ねなく好きな歌ばっかり歌えるのでストレス発散にはいいですねー、ホンマ。今度はフリータイムで歌えるだけ歌ってもいいかもなぁとか思いましたね。安いし。

まぁあんまりないだろうけど、またUSTやっても面白いかもしれないと。逆に他の人のカラオケUSTなど見てみたいかもしれない。但し知り合いに限る(じゃないと面白くないよなぁ〜)