2015-11-11 39 views
0

我有一個BaseActivity可以通過其他任何活動進行擴展。問題是,每當用戶離開(onPause)活動時,我都會將音樂靜音。我也停止聽電話。 問題是,獲取調用每當用戶活動之間切換,這意味着應用程序是不必要的靜音和停止telephonymanager,即使它應該只靜音和停止telephonymanager如果用戶離開應用程序:不必要地調用方法?

@Override 
    protected void onPause() { 

     Log.v(TAG, "IN onPause!"); 
     // unregister phone listener to telephony manager 
     tManager.listen(phoneStateListener, PhoneStateListener.LISTEN_NONE); 

     mute(); 

     super.onPause(); 
    } 

現在說我在public class myClass extends BaseActivity之間切換並切換到public class myOtherClass extends BaseActivity。此開關不必要地正在執行,儘管我只想要在用戶離開應用程序時被稱爲。我該怎麼辦?

感謝專家的意見,

豐富

+0

在您的MusicplayActiviti中編寫用於屏蔽音樂播放器的代碼,而不是在BaseActivity中編寫 – droidev

+0

聽起來像是按預期工作。當另一個「Activity」進入前臺時,Activity的'onPause'方法被調用:https://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle –

+0

@CoryCharlton那麼你是什麼建議我使用。我的意圖是在用戶退出應用時靜音並停止「telephoney manager」。由於我不能使用'onPause',我應該使用什麼? –

回答

0

從我的理解,你是靜音的音樂BaseActivity的的onPause打,而不是說寫你的音樂播放活動中

例如:

public class BaseActivity extends AppCompatActivity{ 

    @Override 
    public void onPause(){ 
     //do things that common for all activities 
    } 
    } 


public void MusicPlayActivity extends AppCompatActivity{ 

@Override 
public void onPause(){ 
music.mute() 
} 
} 

這將工作

UPDATE

有多種方法來檢測你的應用程序是否在後臺運行,但其中只有一個是完全可靠的:自己使用Activity.onPauseActivity.onResume方法應用程序的 軌道知名度。將「可見性」狀態存儲在某個其他課程中。

:實現自定義的應用程序類(注意isActivityVisible()靜態方法):

公共類MyApplication的擴展應用{

public static boolean isActivityVisible() { 
    return activityVisible; 
    } 

    public static void activityResumed() { 
    activityVisible = true; 
    } 

    public static void activityPaused() { 
    activityVisible = false; 
    } 

    private static boolean activityVisible; 
} 

註冊您的應用程序類在AndroidManifest.xml :

<application 
    android:name="your.app.package.MyApplication" 
    android:icon="@drawable/icon" 
    android:label="@string/app_name" > 

將和onResume添加到項目中的每個Activity(如果您願意,可以爲您的活動創建一個共同的祖先,但是如果您的活動已經從MapActivity/ListActivity等擴展出來,則仍然需要手動編寫以下內容):

@Override 
protected void onResume() { 
    super.onResume(); 
    MyApplication.activityResumed(); 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    MyApplication.activityPaused(); 
} 

ActivityLifecycleCallbacks被添加到API級別14(Android 4.0)中。您可以使用它們來跟蹤您的應用程序的活動目前是否對用戶可見。詳細信息請參見下面的Cornstalks' answer

+0

我的回答OnPause只在活動結束時被調用,而不是應用程序。我如何檢測應用程序是否已完成? –

+0

意味着當應用程序變爲背景時,您想讓音頻靜音,不是嗎? – droidev

0

根據您的意見,您只想在應用程序的最後一個Activity退出時停止播放音樂。重寫你的BaseActivity這樣的方法要做到你想要什麼:

@Override 
public void finish() { 
    super.finish(); 

    if (isTaskRoot()) { 
     // This is the last Activity in the stack so mute your music here... 
    } 
} 

其實你可能想onDestroy()onStop()因爲我不知道finish()執行,除非你怎麼稱呼它,但這個想法是一樣的:

@Override 
protected void onDestroy() { 
    super.onDestroy(); 

    if (isTaskRoot()) { 
     // This is the last Activity in the stack so mute your music here... 
    } 
} 

這裏的信息上isTaskRoot()

返回這是否activit y是任務的根源。根是任務中的第一項活動。

返回

真,如果是這樣的根系活力,否則爲假。

+0

好的,所以如果我在活動A並退出,將完成()調用?如果我只是從Activity A切換到Activity B,則不應該調用finish()。謝謝 –

+0

'isTaskRoot'只會查看它是否是activityStack中的最後一個活動。但這不是我想要的,而是我希望應用程序在用戶退出時執行靜音代碼。無論用戶什麼時候或在哪裏退出,但是當他/她這樣做時,我想將其靜音 –

+0

@當用戶按下後退按鈕時,會調用完成()。看到這個帖子的主頁按鈕:https://stackoverflow.com/questions/4783960/call-method-when-home-button-pressed-on-android從你上次評論,雖然你現在需要處理的情況下,用戶從通知中啓動一個新的應用程序,等等。 –

相關問題