AndriodサービスプッシュメッセージをANE(Adobe Native Extension)で起動する(一)
17788 ワード
プロジェクトチームはairで手遊びを開発しているが、オリジナルアプリケーションで実現しやすい機能の中にはairで直接呼び出すことができないものもある.例えば、振動、サービスなどだ.しかしAdobeはairにローカルコード(java,object-c...)を間接的に呼び出す方法を提供しています.次に紹介するANE(Adobe Native Extension)もローカル拡張と呼ばれます.
資料を調べてみると、2011年11月にAdobeの公式にANEを紹介する文章が掲載された.
http://www.adobe.com/cn/devnet/air/articles/developing-native-extensions-air.html
http://www.adobe.com/cn/devnet/air/air_for_android.html
私はまず公式の例に従って、どれだけ良いメディアの音量を調節する拡張をして、そして機械が正常に動いているかをテストしました.そこで私はプロジェクトのニーズを準備し始めました.Andriodサービスを利用してアプリケーションメッセージをプッシュすることに着手しました.そこで、この一連の文章の由来もあり、次に私がした仕事を紹介します.
一、HellAndriod Service
私はこれまでAndriodの開発をしたことがないので、javaにもあまり詳しくありません.唯一のJavaプログラミングの経験は大学時代に参加したJ 2 EEのプロジェクトなので、Andriodサービスのローカルアプリケーションの練習をしました.このような例はネット上で多く、少し修正して、コードは以下の通りです.
サービスにスレッドを開き、1秒おきにバックグラウンド通知を送信します.そして私たちは入り口を作ってそれを起動します.
これらを完了するには、AndroidManifestで権限を設定することを忘れないでください.xmlの の後に追加
シミュレータまたは実際のマシンにインストールしてプログラムを開くと、バックグラウンドメッセージが1秒ごとに更新されます.stopを押して更新を停止します.
では、次の節ではANEの要求に従って改造します.
添付ファイルをアップロードできないので、他の2つの重要なファイルも貼り付けます.
一つはres/layout/activity_main.xml
もう一つはAndroidManifestですxml
資料を調べてみると、2011年11月にAdobeの公式にANEを紹介する文章が掲載された.
http://www.adobe.com/cn/devnet/air/articles/developing-native-extensions-air.html
http://www.adobe.com/cn/devnet/air/air_for_android.html
私はまず公式の例に従って、どれだけ良いメディアの音量を調節する拡張をして、そして機械が正常に動いているかをテストしました.そこで私はプロジェクトのニーズを準備し始めました.Andriodサービスを利用してアプリケーションメッセージをプッシュすることに着手しました.そこで、この一連の文章の由来もあり、次に私がした仕事を紹介します.
一、HellAndriod Service
私はこれまでAndriodの開発をしたことがないので、javaにもあまり詳しくありません.唯一のJavaプログラミングの経験は大学時代に参加したJ 2 EEのプロジェクトなので、Andriodサービスのローカルアプリケーションの練習をしました.このような例はネット上で多く、少し修正して、コードは以下の通りです.
package com.wenbo.helloandriod;
import android.app.Notification;
public class BackgroundService extends Service {
private NotificationManager notificationMgr;
private Thread mthr;
private int mCount=0;
private Boolean mSend=true;
@Override
public void onCreate() {
super.onCreate();
notificationMgr = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
displayNotificationMessage("starting Background Service");
if(mthr == null || mSend == false)
{
mSend=true;
mthr = new Thread(null, new ServiceWorker(), "Background Service");
mthr.start();
}
}
@Override
public void onDestroy()
{
super.onDestroy();
mSend = false;
}
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
class ServiceWorker implements Runnable {
@Override
public void run() {
// do background processing here.....
// stop the service when done...
// BackgroundService.this.stopSelf()
while(mSend)
{
try{
Thread.sleep(1000);
Log.d("", "runnable" + mCount);
displayNotificationMessage("runnable" + mCount);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
}
private void displayNotificationMessage(String message) {
Log.d("", message);
mCount++;
@SuppressWarnings("deprecation")
Notification notification = new Notification(R.drawable.ic_launcher, message,
System.currentTimeMillis());
PendingIntent contentIntent = PendingIntent.getActivity(this, 0, new Intent(this, MainActivity.class), 0);
notification.setLatestEventInfo(this, " ", message, contentIntent);
notificationMgr.notify(R.id.app_notification_id, notification);
}
}
サービスにスレッドを開き、1秒おきにバックグラウンド通知を送信します.そして私たちは入り口を作ってそれを起動します.
package com.wenbo.helloandriod;
import android.os.Bundle;
public class MainActivity extends Activity {
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d(TAG, "starting service");
Button bindBtn = (Button) findViewById(R.id.start);
bindBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
startService(new Intent(MainActivity.this,
BackgroundService.class));
}
});
Button unbindBtn = (Button) findViewById(R.id.stop);
unbindBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
stopService(new Intent(MainActivity.this, BackgroundService.class));
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
これらを完了するには、AndroidManifestで権限を設定することを忘れないでください.xmlの
<service android:name="BackgroundService"/>
シミュレータまたは実際のマシンにインストールしてプログラムを開くと、バックグラウンドメッセージが1秒ごとに更新されます.stopを押して更新を停止します.
では、次の節ではANEの要求に従って改造します.
添付ファイルをアップロードできないので、他の2つの重要なファイルも貼り付けます.
一つはres/layout/activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
<Button
android:id="@+id/start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/textView1"
android:layout_below="@+id/textView1"
android:text="start" />
<Button
android:id="@+id/stop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/start"
android:layout_below="@+id/start"
android:layout_marginTop="15dp"
android:text="stop" />
</RelativeLayout>
もう一つはAndroidManifestですxml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.wenbo.helloandriod"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.wenbo.helloandriod.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name="BackgroundService"/>
</application>
</manifest>