【问题标题】:How to use android function in my own class?如何在我自己的班级中使用 android 功能?
【发布时间】:2014-06-14 16:40:25
【问题描述】:

现在程序运行正常,

这个程序可以打开/关闭wifi

现在我想把这个函数做成库,并简化活动类中的代码

public class MyActivity extends Activity {

    private WifiManager wifiManager;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        wifiManager = (WifiManager) this.getSystemService(Context.WIFI_SERVICE);

        Button bWifi = (Button) findViewById(R.id.button);
        bWifi.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View view) {

                if (!wifiManager.isWifiEnabled())
                {
                    wifiManager.setWifiEnabled(true);
                }
                else
                {
                    wifiManager.setWifiEnabled(false);
                }
                Toast.makeText(getApplicationContext(), "Toggle wifi", Toast.LENGTH_LONG).show();
            }
        });

    }
}

然后我改成这个。修改后应用无法运行,如何调用其他类的android函数?

public class MyActivity extends Activity {

    Setting setting=new Setting();

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Button bWifi = (Button) findViewById(R.id.button);
        bWifi.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View view) {

                setting.toggleWifi();
            }
        });

}

设置类:

public class Setting extends Activity {
    private WifiManager wifiManager;

    public Setting()
    {

        wifiManager = (WifiManager) this.getSystemService(Context.WIFI_SERVICE);
    }


    public void toggleWifi()
    {
        if (!wifiManager.isWifiEnabled())
        {
            wifiManager.setWifiEnabled(true);
        }
        else
        {
            wifiManager.setWifiEnabled(false);
        }
        Toast.makeText(getApplicationContext(), "Toggle Wifi", Toast.LENGTH_LONG).show();
    }
}

这是第二个版本,在这个版本中,只有一个活动。它可以准确地向您显示问题。这个版本还是不行,如果我删除这行

    wifiManager = (WifiManager) (this.activity.getSystemService(Context.WIFI_SERVICE));

该应用程序将运行。

public class MyActivity extends Activity {

    Setting setting=new Setting(this);

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Button bWifi = (Button) findViewById(R.id.button);
        bWifi.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View view) {

            }
        });

    }
}



public class Setting {
    private WifiManager wifiManager;
    private Activity activity;

    public Setting(Activity activity)
    {
        this.activity=activity;
        wifiManager = (WifiManager) (this.activity.getSystemService(Context.WIFI_SERVICE));
    }

}

【问题讨论】:

  • 为什么你的应用中的设置是一个活动?任何时候只有 1 个活动在前台运行。我认为您需要回到 Android 文档并准确了解 Activity 是什么,而不是尝试选择基类以便您的代码能够编译。
  • 使用 new Setting() 创建 Activity 是不合法的。 Activity 生命周期必须由 Android 框架管理:您永远不能使用 new 关键字创建它们。

标签: android sdk android-activity


【解决方案1】:

为什么你的助手类 Setting 扩展了 Activity?我相信您这样做只是为了获取Context 的实例,以便您可以调用getSystemService()。 Activity 是具有自己生命周期的 UI 组件。您不应该将它用作实用程序/帮助程序类。

您可以将上下文从您的Activity 传递给您的设置对象,而不是创建一个 Activity,然后使用该上下文调用 getSystemService()。

 public void toggleWifi(Context mContext)
{   WifiManager wifiManager = = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);
    if (!wifiManager.isWifiEnabled())
    {
        wifiManager.setWifiEnabled(true);
    }
    else
    {
        wifiManager.setWifiEnabled(false);
    }
    Toast.makeText(getApplicationContext(), "Toggle Wifi", Toast.LENGTH_LONG).show();
}

现在您可以从您的Activity 调用此方法

   setting.toggleWifi(MyActivity.this);

注意:当您将 Context 传递给辅助类时,请确保您持有的时间不会超过所需的时间。或者为了简单起见,持有 Context 的时间不要超过 Context 存在的时间。

【讨论】:

  • 我发现了我的ver2的问题,因为我在定义它的时候创建了Setting,Setting setting=new Setting(this);现在我把它放在onCreatesetting=new Setting(this);中,然后一切正常。
  • 是的,如果您将 Context 设置为类级别变量,它也可以为您工作,但最佳做法是不要将 Context 的引用保持得比要求的时间长。小心内存泄漏。参考stackoverflow.com/questions/7880657/…
  • 来自您的参考。现在我知道主要问题是Helper-class 可能比你的 MainActivity 寿命更长。如果我在 onStop() 中添加这个怎么样? setting=null;。这能解决问题吗?
  • 我认为这应该可行,但如果它为空,则必须在 onResume 上重新实例化该变量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多