有2个或更多的活动得到应用更多

由网友(成王败寇)分享简介:我正在写一个启动的应用程序为Android。我能得到的所有应用程序的列表,并推出能够活动I'm writing an Launcher app for android.I can get the list of all applications and launch able activities withAr...

我正在写一个启动的应用程序为Android。 我能得到的所有应用程序的列表,并推出能够活动

I'm writing an Launcher app for android. I can get the list of all applications and launch able activities with

ArrayList<PInfo> res = new ArrayList<PInfo>();
List<PackageInfo> packs = ctx.getPackageManager().getInstalledPackages(PackageManager.GET_ACTIVITIES);

final PackageItemInfo.DisplayNameComparator comparator = new PackageItemInfo.DisplayNameComparator(ctx.getPackageManager());

Collections.sort(packs, new Comparator<PackageInfo>() {
    @Override
    public int compare(PackageInfo lhs, PackageInfo rhs) {
        return comparator.compare(lhs.applicationInfo, rhs.applicationInfo);
    }
});

for (int i = 0; i < packs.size(); i++) {
    PackageInfo p = packs.get(i);
    if (p.packageName != null && ctx.getPackageManager().getLaunchIntentForPackage(p.packageName) != null ) {
        PInfo newInfo = new PInfo();
        if (p.applicationInfo.loadLabel(ctx.getPackageManager()).toString().length() > 15) {
            newInfo.appname = p.applicationInfo.loadLabel(ctx.getPackageManager()).toString().substring(0, 15);
        } else {
            newInfo.appname = p.applicationInfo.loadLabel(ctx.getPackageManager()).toString();
        }
        newInfo.packageName = p.packageName;
        newInfo.icon = p.applicationInfo.loadIcon(ctx.getPackageManager());
        res.add(newInfo);
    }
}

这一点。

不过,问题是,有2推出能够活动包括像电话和联系人应用程序。

But, the problem is, there is 2 launch able activities included like phone and contacts app.

我的意思是比如三星包括联系人推出能够活动,手机的推出能活动同一个包。但与此$ C $词只能得到联系人应用程序到我看来,手机应用程序缺失。别人怎么发射的处理呢? 还是我错过?

I mean for example samsung included contacts launch able activity and phone launch able activity in same package. But with this code i can only get the contacts application into my view, phone app is missing. how other launchers are handling this? or what am i missing?

推荐答案

别找应用程序。寻找可启动的活动,使用 queryIntentActivities() PackageManager

Don't look for apps. Look for launchable activities, using queryIntentActivities() on PackageManager.

例如,这项活动(从此示例项目 )实现了使用该技术主屏幕式的发射器:

For example, this activity (from this sample project) implements a home screen-style launcher using this technique:

/***
  Copyright (c) 2008-2012 CommonsWare, LLC
  Licensed under the Apache License, Version 2.0 (the "License"); you may not
  use this file except in compliance with the License. You may obtain a copy
  of the License at http://www.apache.org/licenses/LICENSE-2.0. Unless required
  by applicable law or agreed to in writing, software distributed under the
  License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
  OF ANY KIND, either express or implied. See the License for the specific
  language governing permissions and limitations under the License.

  From _The Busy Coder's Guide to Android Development_
    http://commonsware.com/Android
*/

package com.commonsware.android.launchalot;

import android.app.ListActivity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import java.util.Collections;
import java.util.List;

public class Launchalot extends ListActivity {
  AppAdapter adapter=null;

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

    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)); 

    adapter=new AppAdapter(pm, launchables);
    setListAdapter(adapter);
  }

  @Override
  protected void onListItemClick(ListView l, View v,
                                 int position, long id) {
    ResolveInfo launchable=adapter.getItem(position);
    ActivityInfo activity=launchable.activityInfo;
    ComponentName name=new ComponentName(activity.applicationInfo.packageName,
                                         activity.name);
    Intent i=new Intent(Intent.ACTION_MAIN);

    i.addCategory(Intent.CATEGORY_LAUNCHER);
    i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
                Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
    i.setComponent(name);

    startActivity(i);    
  }

  class AppAdapter extends ArrayAdapter<ResolveInfo> {
    private PackageManager pm=null;

    AppAdapter(PackageManager pm, List<ResolveInfo> apps) {
      super(Launchalot.this, R.layout.row, apps);
      this.pm=pm;
    }

    @Override
    public View getView(int position, View convertView,
                          ViewGroup parent) {
      if (convertView==null) {
        convertView=newView(parent);
      }

      bindView(position, convertView);

      return(convertView);
    }

    private View newView(ViewGroup parent) {
      return(getLayoutInflater().inflate(R.layout.row, parent, false));
    }

    private void bindView(int position, View row) {
      TextView label=(TextView)row.findViewById(R.id.label);

      label.setText(getItem(position).loadLabel(pm));

      ImageView icon=(ImageView)row.findViewById(R.id.icon);

      icon.setImageDrawable(getItem(position).loadIcon(pm));
    }
  }
}
阅读全文

相关推荐

最新文章