2

我正在为 Xposed 创建一个模块,它可以满足我的需求,但我想为用户提供一个简单的首选项屏幕来输入两个整数值。

我主要使用可以在 XDA上找到的教程。

该教程解释说,必须创建一个 Activity 来显示和管理首选项屏幕,好的。但在那之后,根本没有解释如何将其链接到 Xposed,以便用户可以单击模块列表中的模块名称并访问首选项屏幕,而我只是收到一条消息“模块不提供用户界面”。

我没有找到任何有关如何执行此操作的文档。有人可以告诉我这个吗?

4

1 回答 1

4

我想我找到了罪魁祸首(至少这为我解决了这个问题)。似乎Xposed 会自动检测应用程序是否具有可启动的活动,然后启动它。没有 API。来源:Xposed 源代码:

@Override
public void onListItemClick(ListView l, View v, int position, long id) {
    String packageName = (String) v.getTag();
    if (packageName == null)
        return;

    if (packageName.equals(NOT_ACTIVE_NOTE_TAG)) {
        Intent intent = new Intent(getActivity(), XposedInstallerActivity.class);
        intent.putExtra(XposedInstallerActivity.EXTRA_SECTION, XposedDropdownNavActivity.TAB_INSTALL);
        startActivity(intent);
        return;
    }

    Intent launchIntent = getSettingsIntent(packageName);
    if (launchIntent != null)
        startActivity(launchIntent);
    else
        Toast.makeText(getActivity(), getActivity().getString(R.string.module_no_ui), Toast.LENGTH_LONG).show();
}

因此,您只需要创建一个活动,但我认为这还不够:您还必须在 Eclipse 中将其设为“启动器活动”,或者您可以通过添加CATEGORY_LAUNCHER意图过滤器手动完成。

如果它有效,当您将应用程序从 eclipse 推送到您的测试手机时,该应用程序将自动打开(就像任何其他应用程序一样)。如果发生这种情况,通常应用程序也应该在 Xposed 中打开。

例如,这是我在课堂上放的内容:

package xxx.xxx.xxx;

import android.os.Bundle;
import android.preference.PreferenceActivity;
import android.preference.PreferenceManager;

public class MainSettingsActivity extends PreferenceActivity {

    @SuppressWarnings("deprecation")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       // Setup a non-default and world readable shared preferences, so that 1- we know the name (necessary for XSharedPreferences()), 2- the preferences are accessible from inside the hook.
       PreferenceManager prefMgr = getPreferenceManager();
       prefMgr.setSharedPreferencesName("pref_mine");
       prefMgr.setSharedPreferencesMode(MODE_WORLD_READABLE);
       addPreferencesFromResource(R.xml.pref_settings);
    }

}

然后在你的主类中使用你的钩子内的首选项:

public class Main implements IXposedHookLoadPackage {
    public XSharedPreferences pref;

    @Override
    public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
        XSharedPreferences pref = new XSharedPreferences(Main.class.getPackage().getName(), "pref_mine"); // load the preferences using Xposed (necessary to be accessible from inside the hook, SharedPreferences() won't work)
        pref.makeWorldReadable();
        pref.reload();
        pref.getString("some_var", "default_value");
        ...
于 2015-09-14T00:14:25.927 回答