3

在我Application水平我收到getExtras(),但Activity水平,我可以正确地看到它们。getExtras()返回在应用层(-class)空

public class MyApplication extends Application 
{ 
    @Override 
    public void onCreate() { 
     super.onCreate(); 
     Intent intent = getPackageManager().getLaunchIntentForPackage("com.example.MyApp"); 
     if (intent != null){ 
      String mStaticWorldUrl = intent.getStringExtra("arg1Name"); 
      String mStaticWorldIconUrl = intent.getStringExtra("arg2Name"); 
      Log.i("LOG", mStaticWorldUrl + " --- " + mStaticWorldIconUrl); 
     } 
    } 
} 

我打电话从这个代码创建的快捷方式的一些应用:
( - 每个快捷方式都有不同的Extras发送到Intent

// create a shortcut for the specific app 
public static void createShortcutForPackage(Context context, 
     String packageName, String className, String shortcutName, 
     String arg1Name, String arg1Val, String arg2Name, String arg2Val, 
     int iconID) { 

    Intent intent = new Intent(); 
    intent.setComponent(new ComponentName(packageName, className)); 

    PackageManager pm = context.getPackageManager(); 

    Context pkgContext = createPackageContext(context, packageName); 
    if (pkgContext == null) 
     return; 

    Intent shortcut = new Intent("com.android.launcher.action.INSTALL_SHORTCUT"); 
    Intent shortcutIntent = pm.getLaunchIntentForPackage(packageName); 

    if (arg1Name != null) 
     shortcutIntent.putExtra(arg1Name, arg1Val); 

    if (arg2Name != null) 
     shortcutIntent.putExtra(arg2Name, arg2Val); 

    shortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent); 
    shortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME, shortcutName); 
    shortcut.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE,Intent.ShortcutIconResource.fromContext(context, iconID)); 
    shortcut.putExtra("duplicate", false); 
    context.sendBroadcast(shortcut); 
} 

我如何可以读取这些Extras关于Application的等级?
或者是否有任何其他方式来创建应用程序的不同快捷方式,并在Application上读取其“'参数”数据?

回答

1

这是面向使用getExtra这是意图的方法

原因这个问题在应用级数据得到概念上的错误:

  • 无需额外是因为查询的意图是其中一行早于一行生成 ,意图是操作系统为 包生成,如以下代码所示:Intent intent = getPackageManager()。getLaunchIntentForPackage(“com。 example.M YAPP“);应用程序类的实例中

  • 意向对象:他们不
    交付有

我们先来了解以下事项即将到来的使用期才能使用,而任何人想在应用级数据

  • 什么是意图?
  • 什么是使用意图?
  • 我们还可以用其他什么方法来实现这个目标?

什么是意图?

  • 意图提供一种用于执行后期运行时在不同的应用的代码之间的结合的工具。其最重要的用途是开展活动,在活动中它可以被认为是活动之间的胶水。它基本上是一个被动数据结构,它包含要执行的操作的抽象描述。

  • 临时演员 - 这是一个任何其他信息的组合。这可以用来为组件提供扩展信息。例如,如果我们有一个动作来发送电子邮件,我们也可以包括在这里提供一个主题,正文数据的额外件等

是什么意图的使用?

使用意图促进组件之间的通信在几个方面,下面是标准的使用

  • 要开始活动。
  • 启动服务。
  • 为了提供广播

我们可以用什么其他的东西来实现这一目标?

  • 有很多的事情,我们可以用它来实现这一目标,并解决了这个问题 。

  • 但现在我在这里提到的只是其中一个是标准的,固定 使用的应用程序

  • 内容提供商:要提供从您的应用程序文件到另一个应用程序是 发送接收的应用程序文件的内容URI并授予临时对此URI的访问权限 。具有临时URI 访问权限的内容URI是安全的,因为它们仅适用于接收该URI的应用程序,并且它们会自动过期。

4

Application类对于应用程序是静态的:对于您的应用程序的进程,它只有一个实例。如果您的应用已推出正常版本Intent,而不是您创建的快捷方式,则不会出现任何额外内容。当按下HOME或BACK时,应用程序进程不会停止,因此用于启动程序包的Intent可能不是您认为应该的内容。

您不应该在Application级别查看IntentIntent对象不打算在那里“发送”,而是打算发送到ActivityServiceBroadcastReceiver

+1

是@RedHat没有得到额外的原因是因为查询的意图是一个产生早一行,这是该操作系统已为包产生如下面的代码要求的意图:意向意图= getPackageManager()getLaunchIntentForPackage( “com.example.MyApp”); – yakobom

+0

是的,这是正确的:'PackageManager'方法返回一个'Intent',它可以用来启动指定的包*,它与用于启动包的组件的实际'Intent'不同)@但是,我的回答仍然有效:你不想看'Application'类实例中的'Intent'对象:它们不在那里传递。 –

+0

是@LarrySchiefer,你当然是对的。然而,指出另一个错误是重要的,因为这是一个概念错误。将相同的代码移至活动级别也会导致相同的问题。 – yakobom