0

我有 2 个活动,MainActivity 和 VideoPlayerActivity。在 MainActivity 我有一个套接字,我可以使用 telnet 从我的 PC 连接到它。然后我可以写行,它会执行我发送给它的命令。例如,如果我编写start它将启动 VideoPlayerActivity 并播放电影。

现在我想控制屏幕亮度。在 VideoPlayerActivity 尚未启动的 MainActivity 中,我可以轻松地在 telnet 中编写一个命令brightness=0.1 ,将 MainActivity 的亮度设置为 0.1:

if(msg.startsWith("brightness="))
{
    String brightText = msg.substring(msg.indexOf('=') + 1, msg.length());
    BrightnessValue = Float.parseFloat(brightText);

    WindowManager.LayoutParams lp = getWindow().getAttributes();
    lp.screenBrightness = BrightnessValue;
    getWindow().setAttributes(lp);

    if(_videoPlayerIntent != null && _videoPlayerActivity.isActive)
    {
            _videoPlayerActivity.setBrightnessLevel(BrightnessValue);
    }
}

现在的问题是,当 VideoActivity 启动时,它会忽略预设的亮度,并会使用系统定义的亮度。所以我把这个方法放在 VideoActivity 中:

public void setBrightnessLevel(float value)
{
    WindowManager.LayoutParams lp = getWindow().getAttributes();
    lp.screenBrightness = value;
    getWindow().setAttributes(lp);
}

但是一旦我写了改变亮度的命令,整个应用程序就会停止。由于我在上面的问题中放置的第一个代码中的这一部分:

if(_videoPlayerIntent != null && _videoPlayerActivity.isActive)
{
    Log.d("CALLING VIDEOACTIVITY", "SET BRIGHTNESS");
    _videoPlayerActivity.setBrightnessLevel(BrightnessValue);
}

你能告诉我如何处理这种情况吗?我需要能够在 VideoActivity 运行时更改屏幕亮度,并且我的套接字位于 MainActivity 中...

getWindow()这是 VideoActivity 中的方法....我试图将其设为静态,然后问题是如果该方法是静态的,我将无法访问:

public void setBrightnessLevel(float value)
{
    WindowManager.LayoutParams lp = getWindow().getAttributes();
    lp.screenBrightness = value;
    getWindow().setAttributes(lp);
}
4

1 回答 1

0

你需要一个句柄来Activity设置它的窗口亮度,所以我建议你制作一个模型来告诉第一个活动的创建和销毁Activity

这是监听活动状态的模型:

public class ActivityStateListenerModel {

    public interface OnActivityStateChangedListener {
        void activityStarted(Activity activity);
        void activityDestroyed();
    }

    private static ActivityStateListenerModel mInstance;
    private OnActivityStateChangedListener mListener;

    public static ActivityStateListenerModel getInstance() {
        if(mInstance == null) {
            mInstance = new ActivityStateListenerModel();
        }
        return mInstance;
    }

    public void setListener(OnActivityStateChangedListener listener) {
        mListener = listener;
    }

    public void activityStarted(Activity activity) {
        mListener.activityStarted(activity);
    }

    public void activityDestroyed() {
        mListener.activityDestroyed();
    }

}

您需要OnActivityStateChangedListener在您的接口中实现接口MainActivity并将其设置为监听更改:

public class MainActivity extends Activity implements 
        OnActivityStateChangedListener {

    // in onCreate(...)
    ActivityStateListenerModel.getInstance().setListener(this);

然后是回调,在我们设置标志的那些中,我们需要检查以知道活动仍在运行:

private static boolean mOtherActivityStarted;
private static Activity mOtherActivity;

@Override
public void activityStarted(Activity activity) {
    Log.d(TAG, "Second activity created");
    mOtherActivityStarted = true;
    mOtherActivity = activity;
}

@Override
public void activityDestroyed() {
    Log.d(TAG, "Second activity destroyed");
    mOtherActivityStarted = false;
    mOtherActivity = null;
}

当您的套接字读取数据时,您只需在您的MainActivity

if(mOtherActivity != null && mOtherActivityStarted) {
    SecondActivity.setBrightnessLevel(brightnessValue, mOtherActivity);
}

然后你有另一个Activity(VideoActivity),所以你需要通知模型活动被创建或销毁:

// in onCreate(...)
// This gives the handle to MainActivity
ActivityStateListenerModel.getInstance().activityStarted(this);

// in onDestroy()
ActivityStateListenerModel.getInstance().activityDestroyed();

以及从 VideoActivity 更改亮度的方法(在这种情况下,此方法可以在任何地方,因为我们在参数中传递了活动)

static public void setBrightnessLevel(float value, Activity activity)
{
    Window window = activity.getWindow();
    if(window != null) {
        Log.d(MainActivity.TAG, "Setting brightness to " + activity.getClass().getName());
        WindowManager.LayoutParams lp = window.getAttributes();
        lp.screenBrightness = value;
        window.setAttributes(lp);
    }
}

并且以小写字母开头命名变量也是一个好习惯......

(BrightnessValue => brightnessValue)

于 2013-12-18T14:54:45.337 回答