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

时间:2016-08-10 14:49:21

标签: android android-lifecycle

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

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

enter image description here

现在当我从托盘点击静音到正常模式时,我应该使用哪种方法来反映更改。

uiupdate

我尝试了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开发的示例应用程序。

1 个答案:

答案 0 :(得分:1)

拖动或拉起通知托盘时没有任何直接回调。它意味着与应用程序分离。话虽这么说,你可能会尝试一些事情。

首先,您可以编写一个定期轮询振铃状态的服务。不是理想的解决方案,但这肯定会奏效。

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

@Override
public void onWindowFocusChanged(boolean hasFocus) {

    if(hasFocus) {
        // check ringer status
    }

}

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

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