【问题标题】:How can I pass a list of selected packages to a service in Android?如何将选定包的列表传递给 Android 中的服务?
【发布时间】:2014-07-03 12:53:49
【问题描述】:

我正在尝试在我的应用中设置白名单。我有一个服务设置,当它检测到某个应用程序已启动时会触发另一个服务。我有一个包裹挑选活动,它用复选框构建了一个漂亮的列表。当我选择一个复选框时,我想将该选定的应用程序添加到“白名单”中。然后,我希望我的服务在运行时检查该白名单。我无法让我的白名单将其列表传递给我的服务。这是我正在使用的包列表...

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

    getActionBar().setDisplayHomeAsUpEnabled(true);

    // this has to be done before any preferences are populated!
    getPreferenceManager().setSharedPreferencesMode(Context.MODE_WORLD_READABLE);

    addPreferencesFromResource(R.xml.preferences2);

    // get a list of launchable apps
    PackageManager pm = getPackageManager();
    Intent main = new Intent(Intent.ACTION_MAIN, null);

    main.addCategory(Intent.CATEGORY_LAUNCHER);

    List<ResolveInfo> launchables = pm.queryIntentActivities(main, 0);

    Collections.sort(launchables,
            new ResolveInfo.DisplayNameComparator(pm));

    PreferenceCategory targetCategory = (PreferenceCategory) findPreference("targetCategory");
    targetCategory.setTitle(getString(R.string.settings_header));

    for (ResolveInfo info : launchables) {

        // get app info
        ActivityInfo activity = info.activityInfo;
        ComponentName name = new ComponentName(activity.applicationInfo.packageName, activity.name);
        final String pkgName = name.getPackageName();
        CharSequence appName = info.loadLabel(pm);

        CheckBoxPreference checkBoxPreference = new CheckBoxPreference(this);

        // set the data
        checkBoxPreference.setKey(pkgName);
        checkBoxPreference.setTitle(appName);
        checkBoxPreference.setSummary(pkgName);
        checkBoxPreference.setIcon(info.loadIcon(pm));

        // add to category
        targetCategory.addPreference(checkBoxPreference);
    }
}

protected void onResume() {
    super.onResume();
    getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
}

public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
    Preference pref = findPreference(key);
    CheckBoxPreference cbtp = (CheckBoxPreference) pref;
    final String pkgName = key;
}

}

这是我用来检查正在运行的应用程序的服务。我需要检查是否已从该列表中选择了正在运行的应用程序。如果已检查当前应用程序,我希望我的服务运行。我的服务运行良好,而且列表很好。我似乎无法让他们一起工作。

                @Override
            public void run() {
                SharedPreferences mySharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
                 vibenabled = mySharedPreferences.getBoolean("vib_preference", false);
                 pkgName = prefs.getBoolean(pkgName, false);
                ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
                Log.d(TAG, "Its running");   

        String lastPkg = am.getRunningTasks(1).get(0).topActivity.getPackageName();
       if (selectedPkg.equals(lastPkg)) {
              startService();

【问题讨论】:

    标签: java android performance listview sharedpreferences


    【解决方案1】:

    使用活页夹:

    • 您的活动在活动运行期间绑定到服务。
    • 您的服务将自定义活页夹对象返回给活动
    • 然后您的 Activity 可以通过 binder 对象直接或间接访问服务白名单(即让自己成为 getWhiteList()addToWhiteList() 方法)

    或者您可以通过自定义广播接收器使用意图:

    • 在您的服务中实现广播接收器
    • 只要单击复选框,就向该接收者发送意图。
    • 将选中的复选框类型(即应用的 pkgname)作为额外的 Intent

    或者您可以通过服务的startService() 方法使用意图:

    • 将选中的复选框类型(即应用的 pkgname)作为额外的 Intent
    • 使用意图调用启动服务
    • 您应该获得意图,包括传递给 onStartCommand 方法的额外内容

    或者(便宜的解决方案):

    • 将复选框选择写入首选项
    • 更改复选框后再次启动服务
    • onStartCommand 中添加一些代码,用于检查更改并更新列表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-07
      • 1970-01-01
      • 2011-05-06
      • 1970-01-01
      • 2016-08-21
      • 1970-01-01
      相关资源
      最近更新 更多