Android中使用Notification並通過點擊Notification重新啟動Activity – Android移動開發技術文章_手機開發 Android移動開發教學課程

 

我們在使用別的軟件的時候,經常會看到在手機的最頭部有一個小圖標,表示程序依然在啟動著。比如一些音樂播放軟件天天動聽,還有服務程序正點工具箱,還有騰訊QQ等。本文就帶您來瞭解一些如何做到這些功能。

相關知識點為:
NotificationManager,getSystemService,NOTIFICATION_SERVICE,getBaseContext,Notification,

Class.forName,setFlags,FLAG_ACTIVITY_SINGLE_TOP,PendingIntent,setLatestEventInfo,FLAG_ONGOING_EVENT,notify,cancel.
效果圖:

 

我們先上代碼:

	//兩個參數,第一個為一個圖標的ID,第二個為一個字符串對應的ID
    public void StartNM(int icoID,int strID)
    {
        //獲取到系統服務中的通知服務NOTIFICATION_SERVICE
        nManager = (NotificationManager)getSystemService(getBaseContext().NOTIFICATION_SERVICE);
        //將字符串傳化為Notification所需用的格式CharSequence
        CharSequence str = getBaseContext().getText(strID);
        //新建一個通知對象
        Notification notification = new Notification(icoID,str,System.currentTimeMillis());
 
        Intent intent = null;
        try {
            intent = new Intent(this,Class.forName("com.jouhu.gpsservice.GPSServiceActivity"));
            intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
            //PendingIntent為一個特殊的Intent,通過getBroadcast或者getActivity或者getService得到.
            PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);
            notification.setLatestEventInfo(this, str, str, pendingIntent);
            notification.flags |= Notification.FLAG_ONGOING_EVENT;
            //啟動通知事件
            nManager.notify(strID, notification);
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
 
    }
    //
    public void StopNM(int strID)
    {
        //獲取到系統服務中的通知服務NOTIFICATION_SERVICE
        nManager = (NotificationManager)getSystemService(getBaseContext().NOTIFICATION_SERVICE);
        nManager.cancel(strID);
    }

在我們的按鈕事件裡面通過以下方法就可以啟動和關閉瞭。

	StartNM(R.drawable.logo,R.string.app_name);
//以及
StopNM(R.string.app_name);

裡面還涉及到一些步驟。
1 制作一個16 * 16 的logo.PNG文件放到res/drawable-hdpi,res/drawable-ldpi,res/drawable-mdpi文件夾中,刷新本項目,在gen/com.jouhu/gpsservice中就會生成一個logo的id瞭,程序中就可以使用R.drawable.logo調用瞭
2 註意,我們需要使用類的全名來創建這個Intent,否則會出現找不到的情況。

		new Intent(this,Class.forName("com.jouhu.gpsservice.GPSServiceActivity"));

3 註意要加這個代碼

		intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

the activity will not be launched if it is already running at the top of the history stack.
解釋為Activity不會被多次執行。
4 在開發音樂類程序的時候,我們需要考慮當Activity關閉的時候,下次啟動音樂程序,需要繼續當前的音樂,所有需要將當前的信息傳遞到重新啟動的Activity中。
How to send parameters from a notification-click to an activity?文章提到瞭解決這個問題的思路。

For managing if the activity is already running you have two ways:
>>如果Activity已經運行有兩種方法

Add FLAG_ACTIVITY_SINGLE_TOP flag to the Intent when launching the activity, and then in the activity class implement onNewIntent(Intent intent) event handler, that way you can access the new intent that was called for the activity (which is not the same as just calling getIntent(), this will always return the first Intent that launched your activity.
>>當啟動Activity的時候添加FLAG_ACTIVITY_SINGLE_TOP到Intent(本代碼已經包含),在Activity類中實現onNewIntent的事件處理。
Same as number one, but instead of adding a flag to the Intent you must add “singleTop” in your activity AndroidManifest.xml.

	<activity
    android:name=".ArtistActivity"
    android:label="Artist"
    android:launchMode="singleTop">
</activity>

項目的圖效果如下:

參考文章:
1 /kf/201111/111858.html
2 /kf/201111/111859.html
3 http://stackoverflow.com/questions/1711785/android-single-top-launch-mode-and-onnewintent-method
4 http://developer.android.com/guide/topics/ui/notifiers/notifications.html

本文同發地址:http://doandroid.info/?p=1377

發佈留言