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サービスのローカルアプリケーションの練習をしました.このような例はネット上で多く、少し修正して、コードは以下の通りです.
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>