有2个或更多的活动得到应用 [英] Getting applications with 2 or more activities

查看:113
本文介绍了有2个或更多的活动得到应用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在写一个启动的应用程序为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));
    }
  }
}

这篇关于有2个或更多的活动得到应用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆