2014-09-04 75 views
2

因此,我試圖創建一個應用程序,其功能類似於Android手機的鬧鐘,它會在用戶選定的時間提醒用戶。當警報屏幕顯示時,用戶可以選擇推送通知或暫停,應用程序將推送通知然後關閉。完成後應用程序不會關閉()

但是,當我點擊打盹或通知按鈕時,應用程序未關閉。相反,該應用程序可以停止警報聲並最小化(就像用戶觸摸主頁按鈕時一樣)。如果我觸摸最近的應用程序,然後我可以再次打開警報屏幕。

編輯:我知道有一些代碼,如System.exit()或killProcess,因爲這些代碼不建議,我寧願避免使用它們。 我問的原因是因爲我測試了我的手機(4.3)附帶的真實時鐘應用程序,並且在按下暫停或解除按鈕後,它的警報屏幕將會關閉。所以一定有辦法讓我也這樣做,對吧?

回答 好了,所以作爲Sagar Pilkhwal下面解釋,閱讀等相關的問題後,我發現,有沒有「好」的方法,通過代碼的應用程序關閉,你不得不離開該選項的用戶或OS。除非你想使用System.exit或killProcess,但它們是迫使你的應用程序關閉的壞方法。

對於這個問題,Sagar Pilkhwal也有另外一種方法,如果你不想讓你的提醒屏幕出現在最近的應用程序中,你會提出另一個活動。

但是,至於這種情況和一般的Alarm Manager,打開MainActivity會導致討厭的東西,因爲MainActivity是我們處理Alarm事件的時候。後來我發現另一種解決辦法,如果你不想讓你的警報屏幕在最近的應用程序顯示出來,只需添加

android:excludeFromRecents="true" 

您Alert.class活動的清單,或添加Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS用來啓動意圖Alert.class。

這會導致其他問題,因爲當用戶按下主頁按鈕時,鬧鐘不會關閉,並且用戶無法打開最近的應用程序來訪問警報屏幕(他必須打開應用程序這樣做)。我通過嘗試檢測主按鈕按下事件來解決此問題。詳細答案如下。

+0

考慮制定[最小的,完整的,並且覈查示例](http://stackoverflow.com/help/mcve)。這是很多代碼,並不是所有的都需要重現你的問題。包含您編程的語言以及您正在編程的設備是有幫助的。 – 2014-09-04 18:29:51

+0

謝謝,我編輯並刪除了部分代碼。其餘的,我真的不知道它是否與問題有關(如果我知道我然後我不會問這個問題),所以爲了安全起見,我仍然保留它。 – Usin2705 2014-09-05 05:08:54

回答

1

Android的設計並不傾向於選擇退出應用程序,而是由操作系統來管理它。您可以通過其相應的意圖打開主頁應用:

public void quit() { 
    Intent startMain = new Intent(Intent.ACTION_MAIN); 
    startMain.addCategory(Intent.CATEGORY_HOME); 
    startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    startMain.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    startActivity(startMain); 
} 

不那麼推薦的方法來關閉應用只要致電:

android.os.Process.killProcess(android.os.Process.myPid()); 

System.exit(0); 

否則由於對具體的生活 - Android的活動循環,你不能確定該應用程序是關閉/殺死。

+0

因此,從技術上講,我的代碼沒有錯?完成後應用程序不會關閉的原因不是因爲我不小心將一些錯誤的代碼放在其中,而是因爲Android以這種方式處理應用程序? – Usin2705 2014-09-05 04:46:59

+0

是的,你可以這麼說,試試'this.finish();'如果你想真的退出你的應用程序然後嘗試'android.os.Process.killProcess(android.os.Process.myPid());'或'System .exit(0);' – 2014-09-05 05:53:50

+0

@Sagar我正面臨着這個問題,你能幫我一把。 – 2015-08-05 06:06:18

1

以及im thinknig。

System.exit(0); 

也許?即時通訊新的android你..但我有時使用它..

+1

千萬不要使用'System.exit(0)'。這違背了Android編碼實踐。它旨在立即退出應用程序,這不是你想要的。另一種方法是使用finish()方法,前提是您有理由事先離開應用程序。 'System.exit(0)'執行時會發生什麼?答案:虛擬機停止進一步執行,程序將退出。 – 2014-09-04 18:49:33

+0

哦好吧,這是爲了殘酷的力量完成吧?所以服務和接收器也正在被殺呢?對?? @SagarPilkhwal – 2014-09-04 18:59:25

+0

檢查此[post](http://stackoverflow.com/a/18802574/3326331),它表示在使用'System.exit(0);'時,* AdMob *存在問題。 – 2014-09-04 19:03:10

0
System.exit(0); 

這一權利將被關閉的應用程序,留下沒有在background.However運行,明智地利用這一點,並不會留下打開的文件,數據庫處理開放等,這些事情通常會通過清理finish()命令。

我個人恨我在應用程序中選擇退出並且它並不真正退出。

1

將下面的體現,在您的警報活動:

android:excludeFromRecents="true" //this will make the Activity be exclude from recents list. 

您還可以添加android:launchMode="singleInstance"android:taskAffinity=""(如果你知道他們在做什麼)

在Alert類,用它來檢測home鍵按下事件:

@Override 
public void onPause() { 
    if (!isFinishing()) { 
     createNotf(); //Handle home button press here. 
    } 
    super.onPause(); 
} 

使用此處理後退按鈕按下:(你有,如果你想檢測到有這樣的代碼home按鈕使用isFinishing();

@Override 
public void onBackPressed() { 
    //Handle BackButton event here. 
} 

對於我的情況下,只有當用戶按下home鍵,我將創建一個通知,這樣他既可以在通知單擊或再次打開該應用程序來訪問警報屏幕:

private void createNotf() { 
    Intent screenIntent = new Intent(MyAlert.this, MyAlert.class); 
    screenIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    screenIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); 
    Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher); 
    PendingIntent pIntent = PendingIntent.getActivity(MyAlert.this, MainActivity.SEND_ALARM_CODE, screenIntent, PendingIntent.FLAG_CANCEL_CURRENT); 
    Notification.Builder ntfBuilder = new Notification.Builder(this) 
    .setAutoCancel(true) 
    .setContentTitle("ALARM_RUNNING") 
    .setLargeIcon(bitmap) 
    .setSmallIcon(R.drawable.ic_launcher) 
    .setContentText("CLICK_TO_OPEN_ALERTSCREEN.") 
    .setContentIntent(pIntent); 

    NotificationManager myNotfM = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);  
    myNotfM.notify(999, ntfBuilder.build());   
} 

當警報停止,該通知還應該清楚:

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    NotificationManager mntfM = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
    mntfM.cancel(999);} 
相關問題