Android 5.1 - 当我从通知托盘更改配置时如何更新 UI 更改?

Android 5.1 -How do i update the UI change when i change configuration from notification tray?

我有一个简单的应用程序,可以将静音模式切换为正常模式,反之亦然。但问题是我只需拖动通知托盘即可将模式从静音更改为正常,我希望其中的音量图标也更改为正常图标。

当我下拉托盘通知时应用程序进入哪个状态?

现在当我从托盘点击静音到正常模式时,我应该把我的更新方法放在哪个方法来反映变化。

ui更新

我试过 callinf updateUI 方法 onResume 但没有成功,因为应用程序似乎没有暂停。

MainActivity.java

package com.example.manis.silentmodetoggle;

import android.app.Activity;
import android.media.AudioManager;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageView;

public class MainActivity extends Activity {

    private AudioManager audioManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Log.v("myTest","called onCreate");
        setContentView(R.layout.activity_main);

        //reference to the audio manager
        audioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
        FrameLayout contentView = (FrameLayout) findViewById(R.id.content);

        updateUi();

        contentView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                RingerHelper.performToggle(audioManager);
                updateUi();
            }
        });
    }

    private void updateUi(){
        ImageView imageView = (ImageView) findViewById(R.id.imageView);

        //Set The PhoneImage
        int phoneImage =RingerHelper.isPhoneSilent(audioManager) ? R.drawable.noaudio_96: R.drawable.highvolume_96 ;

        imageView.setImageResource(phoneImage);
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.v("myTest","Called onStart");

    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.v("myTest","Called onResume");
        updateUi();

    }

    @Override
    protected void onPostResume() {
        super.onPostResume();
        Log.v("myTest","Called onPostResume");
    }



    @Override
    protected void onPause() {
        super.onPause();
        Log.v("myTest","Called onPause");
    } 
 }

package com.example.manis.silentmodetoggle;

import android.media.AudioManager;


public class RingerHelper {

    private RingerHelper(){};

    public static void performToggle(AudioManager audioManager)
    {
       //if the phone is currently silent then set ot normal
        //if normal then set to silent
        audioManager.setRingerMode(
                isPhoneSilent(audioManager)? AudioManager.RINGER_MODE_NORMAL : AudioManager.RINGER_MODE_SILENT
        );
    }

    public  static  boolean isPhoneSilent(AudioManager audioManager){
        return audioManager.getRingerMode() == AudioManager.RINGER_MODE_SILENT;

    }
}

ps:这是来自 Android App development from dummies book 的示例应用程序。

通知栏被下拉或拉起时没有任何直接回调。它旨在与应用程序分离。话虽这么说,但您可以尝试一些事情。

首先,您可以编写一个服务来定期轮询铃声状态。不是理想的解决方案,但这绝对有效。

其次,您可以尝试实施 onWindowFocusChanged(),如下所示:

@Override
public void onWindowFocusChanged(boolean hasFocus) {

    if(hasFocus) {
        // check ringer status
    }

}

如果您希望能够以编程方式从您的应用程序中扩展状态栏,您可以包含此权限:

<uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />