梅明子 2015-12-29 02:18 采纳率: 100%
浏览 2948
已采纳

Android 自动旋转屏幕快捷开关,系统会发送广播吗?

就是下图这里的自动旋转屏幕开关,开启和关闭自动旋转系统会发送广播吗?什么广播?怎么监听它的状态改变?
图片说明

  • 写回答

1条回答 默认 最新

  • zby_2015 2015-12-29 03:02
    关注

    屏幕旋转开关:
    1). 屏幕旋转开关设置主要调用android.provider.Settings.System的putInt和getInt方法实现。

      2). 通过ContentObserver来动态观察屏幕旋转设置的改变。
    
         示例代码如下:
    

    package com.example.srs;

    import android.app.Activity;

    import android.content.ContentResolver;

    import android.content.Context;

    import android.database.ContentObserver;

    import android.net.Uri;

    import android.os.Bundle;

    import android.os.Handler;

    import android.provider.Settings;

    import android.provider.Settings.SettingNotFoundException;

    import android.util.Log;

    import android.view.View;

    import android.view.View.OnClickListener;

    import android.widget.Button;

    import android.widget.Toast;

    public class ScreenRotationSwitch extends Activity implements OnClickListener

    {

    private Button mRotationButton;

    private RotationObserver mRotationObserver;  
    /** Called when the activity is first created. */  
    @Override  
    public void onCreate(Bundle savedInstanceState)  
    {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.main);  
        //创建观察类对象  
        mRotationObserver = new RotationObserver(new Handler());  
    
        mRotationButton = (Button) findViewById(R.id.rotation);  
        refreshButton();  
        mRotationButton.setOnClickListener(this);  
    }  
    
    
    @Override  
    protected void onDestroy() {  
        // TODO Auto-generated method stub  
        super.onDestroy();  
        //解除观察变化  
        mRotationObserver.stopObserver();  
    }  
    
    
    @Override  
    protected void onResume() {  
        // TODO Auto-generated method stub  
        super.onResume();  
        //注册观察变化  
        mRotationObserver.startObserver();  
    }  
    
    
    //更新按钮状态  
    private void refreshButton()  
    {  
        if (getRotationStatus(this) == 1)  
        {  
            mRotationButton.setText(R.string.rotation_off);  
        }  
        else  
        {  
            mRotationButton.setText(R.string.rotation_on);  
        }  
    }  
    
    //得到屏幕旋转的状态  
    private int getRotationStatus(Context context)  
    {  
        int status = 0;  
        try  
        {  
            status = android.provider.Settings.System.getInt(context.getContentResolver(),  
                    android.provider.Settings.System.ACCELEROMETER_ROTATION);  
        }  
        catch (SettingNotFoundException e)  
        {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        }  
        return status;  
    }  
    
    private void setRotationStatus(ContentResolver resolver, int status)  
    {  
        //得到uri  
        Uri uri = android.provider.Settings.System.getUriFor("accelerometer_rotation");  
        //沟通设置status的值改变屏幕旋转设置  
        android.provider.Settings.System.putInt(resolver, "accelerometer_rotation", status);  
        //通知改变  
        resolver.notifyChange(uri, null);  
    }  
    
    @Override  
    public void onClick(View v)  
    {  
        // TODO Auto-generated method stub  
    
        if (getRotationStatus(this) == 1)  
        {  
    
            setRotationStatus(getContentResolver(), 0);  
        }  
        else  
        {  
            setRotationStatus(getContentResolver(), 1);  
        }  
    }  
    
    //观察屏幕旋转设置变化,类似于注册动态广播监听变化机制  
    private class RotationObserver extends ContentObserver  
    {  
        ContentResolver mResolver;  
    
        public RotationObserver(Handler handler)   
        {  
            super(handler);  
            mResolver = getContentResolver();  
            // TODO Auto-generated constructor stub  
        }  
    
        //屏幕旋转设置改变时调用  
        @Override  
        public void onChange(boolean selfChange)   
        {  
            // TODO Auto-generated method stub  
            super.onChange(selfChange);  
            //更新按钮状态  
            refreshButton();  
            Toast.makeText(ScreenRotationSwitch.this, "旋转屏幕设置有变化",  
                    Toast.LENGTH_SHORT).show();  
        }  
    
        public void startObserver()  
        {  
            mResolver.registerContentObserver(Settings.System  
                    .getUriFor(Settings.System.ACCELEROMETER_ROTATION), false,  
                    this);  
        }  
    
        public void stopObserver()  
        {  
            mResolver.unregisterContentObserver(this);  
        }  
    }  
    

    }

     权限添加:
    

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 乘性高斯噪声在深度学习网络中的应用
  • ¥15 运筹学排序问题中的在线排序
  • ¥15 关于docker部署flink集成hadoop的yarn,请教个问题 flink启动yarn-session.sh连不上hadoop,这个整了好几天一直不行,求帮忙看一下怎么解决
  • ¥30 求一段fortran代码用IVF编译运行的结果
  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
  • ¥30 python代码,帮调试,帮帮忙吧