首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >自定义设置以触发外壳脚本

自定义设置以触发外壳脚本
EN

Stack Overflow用户
提问于 2015-07-27 17:55:55
回答 1查看 169关注 0票数 3

所以,我正在为我的android手机开发一个“自定义设置”应用程序,我需要一些帮助.

我想做的是..。我希望能够在/res/ xml /file.xml中设置一个Preference,它会根据xml中的某个值触发一个shell脚本。

所以,假设我的Preference是:

代码语言:javascript
运行
复制
<ListPreference android:key="dp_cleaner" android:title="My Cleaner" android:entries="@array/dp_cleaner_entries" android:entryValues="@array/dp_cleaner_entries_values" />

触发shell脚本的.smali方法是

代码语言:javascript
运行
复制
.method public static execRootCmdSilent(Ljava/lang/String;)I
# Contains all my code to fire it off...
.end method

使用

代码语言:javascript
运行
复制
:try_start_0
const-string v2, "THE_COMMAND"
invoke-static {v2}, Lcom/android/settings/ExecSH;->execRootCmdSilent(Ljava/lang/String;)I
:try_end_0
.catch Ljava/lang/Exception; {:try_start_0 .. :try_end_0} :catch_0

我如何从列表中被点击的值填充我的const-string?我假设我将需要通过findPreference以某种方式通过key,但我不知道我如何能够把被点击的值传递给方法.

会不会像这样简单:

代码语言:javascript
运行
复制
.class public Lcom/android/settings/ExecSH;
.super Lcom/android/settings/SettingsPreferenceFragment;
.source "ExecSH.java"

.implements Landroid/preference/Preference$OnPreferenceChangeListener;
.implements Landroid/preference/Preference$OnPreferenceClickListener;


# direct methods
.method public onPreferenceTreeClick(Landroid/preference/PreferenceScreen;Landroid/preference/Preference;)Z

    :try_start_0
    const-string v2, Landroid/preference/Preference;->findPreference(Ljava/lang/CharSequence;)Landroid/preference/Preference;

    invoke-static {v2}, Lcom/android/settings/ExecSH;->execRootCmdSilent(Ljava/lang/String;)I
    :try_end_0
    .catch Ljava/lang/Exception; {:try_start_0 .. :try_end_0} :catch_0

.end method

.method public static execRootCmdSilent(Ljava/lang/String;)I
#MY CODE
.end method
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-06 18:11:46

您的类需要实现Preference.OnPreferenceChangedListener接口,并设置为您的ListPreference更改侦听器。您的侦听器方法将作为参数传递新值,此时您可以将其传递给execRootCmdSilent方法。

关键的smali部分位于以下文件的底部:

代码语言:javascript
运行
复制
.method public onPreferenceChange(Landroid/preference/Preference;Ljava/lang/Object;)Z

    move-object v2, p2

    // there are some more moves here and a test, which is why we're shuffling registers

    move-object v3, v2

    invoke-virtual {v3}, Ljava/lang/Object;->toString()Ljava/lang/String;

    move-result-object v3

    invoke-static {v3}, Lsarbs/com/tinker/SettingsActivity;->execRootCmdSilent(Ljava/lang/String;)I

基本上,p2值是传递给onPreferenceChange方法(newValue)的第二个参数。我们将其移动到本地寄存器中,然后在其上invoke-virtual toString方法。将该调用的结果移动到v3寄存器中,然后可以使用该v3寄存器作为参数使用execRootCmdSilent方法。

我用来实现这个的Java代码:

代码语言:javascript
运行
复制
package sarbs.com.tinker;

import android.os.Bundle;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.PreferenceActivity;

public class SettingsActivity extends PreferenceActivity implements Preference.OnPreferenceChangeListener {
    ListPreference mListPreference;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        addPreferencesFromResource(R.xml.pref_general);

        mListPreference = (ListPreference) findPreference("dp_cleaner");
        mListPreference.setOnPreferenceChangeListener(this);
    }

    @Override
    public boolean onPreferenceChange(Preference preference, Object newValue) {
        if (preference == mListPreference) {
            execRootCmdSilent(newValue.toString());
        }
        return true;
    }

    public static int execRootCmdSilent(String str) {
        return 0;
    }
}

它产生的smali代码:

代码语言:javascript
运行
复制
.class public Lsarbs/com/tinker/SettingsActivity;
.super Landroid/preference/PreferenceActivity;
.source "SettingsActivity.java"

# interfaces
.implements Landroid/preference/Preference$OnPreferenceChangeListener;


# instance fields
.field mListPreference:Landroid/preference/ListPreference;


# direct methods
.method public constructor <init>()V
    .registers 3

    .prologue
    .line 8
    move-object v0, p0

    .local v0, "this":Lsarbs/com/tinker/SettingsActivity;
    move-object v1, v0

    invoke-direct {v1}, Landroid/preference/PreferenceActivity;-><init>()V

    return-void
.end method

.method public static execRootCmdSilent(Ljava/lang/String;)I
    .registers 3

    .prologue
    .line 30
    move-object v0, p0

    .local v0, "str":Ljava/lang/String;
    const/4 v1, 0x0

    move v0, v1

    .end local v0    # "str":Ljava/lang/String;
    return v0
.end method


# virtual methods
.method protected onCreate(Landroid/os/Bundle;)V
    .registers 7

    .prologue
    .line 13
    move-object v0, p0

    .local v0, "this":Lsarbs/com/tinker/SettingsActivity;
    move-object v1, p1

    .local v1, "savedInstanceState":Landroid/os/Bundle;
    move-object v2, v0

    move-object v3, v1

    invoke-super {v2, v3}, Landroid/preference/PreferenceActivity;->onCreate(Landroid/os/Bundle;)V

    .line 15
    move-object v2, v0

    const v3, 0x7f030001

    invoke-virtual {v2, v3}, Lsarbs/com/tinker/SettingsActivity;->addPreferencesFromResource(I)V

    .line 17
    move-object v2, v0

    move-object v3, v0

    const-string v4, "dp_cleaner"

    invoke-virtual {v3, v4}, Lsarbs/com/tinker/SettingsActivity;->findPreference(Ljava/lang/CharSequence;)Landroid/preference/Preference;

    move-result-object v3

    check-cast v3, Landroid/preference/ListPreference;

    iput-object v3, v2, Lsarbs/com/tinker/SettingsActivity;->mListPreference:Landroid/preference/ListPreference;

    .line 18
    move-object v2, v0

    iget-object v2, v2, Lsarbs/com/tinker/SettingsActivity;->mListPreference:Landroid/preference/ListPreference;

    move-object v3, v0

    invoke-virtual {v2, v3}, Landroid/preference/ListPreference;->setOnPreferenceChangeListener(Landroid/preference/Preference$OnPreferenceChangeListener;)V

    .line 19
    return-void
.end method

.method public onPreferenceChange(Landroid/preference/Preference;Ljava/lang/Object;)Z
    .registers 8

    .prologue
    .line 23
    move-object v0, p0

    .local v0, "this":Lsarbs/com/tinker/SettingsActivity;
    move-object v1, p1

    .local v1, "preference":Landroid/preference/Preference;
    move-object v2, p2

    .local v2, "newValue":Ljava/lang/Object;
    move-object v3, v1

    move-object v4, v0

    iget-object v4, v4, Lsarbs/com/tinker/SettingsActivity;->mListPreference:Landroid/preference/ListPreference;

    if-ne v3, v4, :cond_12

    .line 24
    move-object v3, v2

    invoke-virtual {v3}, Ljava/lang/Object;->toString()Ljava/lang/String;

    move-result-object v3

    invoke-static {v3}, Lsarbs/com/tinker/SettingsActivity;->execRootCmdSilent(Ljava/lang/String;)I

    move-result v3

    .line 26
    :cond_12
    const/4 v3, 0x1

    move v0, v3

    .end local v0    # "this":Lsarbs/com/tinker/SettingsActivity;
    return v0
.end method
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31659997

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档