2012-03-22 69 views
2

我正在制作一个Android应用程序插件。我试图使其尽可能通用,这对我来说是一个问题。我正在设计插件,以便我制作的任何未来应用都可以轻松实现插件。我拥有的问题是插件包含一项服务,该服务会定期通过通知提醒用户。当用户打开通知栏并触摸通知时,需要打开最初启动服务的活动。如何确定哪个活动启动了一项服务?

该服务使用此代码开始:

startService(new Intent(this, myService.class)); 

以及服务启动使用此代码通知:

Intent notificationIntent = new Intent(this, myClass.class); 

目前,myClass.class是硬编码到通知。这意味着无论我制作多少个不同的应用程序,如果使用此插件,我必须始终命名启动服务“myClass”的类。

我想要一种通用的方式来获得启动服务的原始活动。

回答

2

好吧,我理解了它。我不确定这是否有点“黑客”,但在发布原始问题之前我不知道的是,您可以创建一个通用意图,然后使用包和类的路径字符串设置类信息。这是我使用的代码的副本。

在活动启动服务,其实之前启动服务:

serviceIntent.putExtra("PackagePath",this.getPackageName()); 
    serviceIntent.putExtra("ClassPath", this.getPackageName() + "." + this.getLocalClassName()); 

,服务在onStart事件中:

packagePath = intent.getExtras().getString("PackagePath"); 
    classPath = intent.getExtras().getString("ClassPath"); 

最后建立在服务的通知时:

Intent notificationIntent = new Intent(); 
    notificationIntent.setClassName(packagePath, classPath); 

这两个包含什么的例子特林变量:

packagePath = "myApp.main" 
    classPath = "myApp.main.mainActivity" 

特别感谢CommonsWare指着我使用Parceables的道路上,因为寻找如何通过意图传递Parceable例子给我带来

3

我想通用的方式来获得启动服务的原始活动。

把你需要的信息在IntentIntent演员与startService()使用。服务无法确定启动它的活动,很大程度上是因为服务不必由活动启动...

+0

那么,如何把一个类的演员?我知道如何做字符串,整数等等,但是没有选择通过一个类作为额外的选项。 – 2012-03-22 14:56:11

+0

@LucasBailey:一堂课对你来说毫无用处。您指出涉及多个应用程序,并且您的服务不能有其他项目的'Class'对象。最好的答案是让你通过一个额外的'PendingIntent'传递给'Notification',所以客户端活动可以做出关于标志等的决定,这可能对它很重要。一个'PendingIntent'是'Parcelable',所以它可以进入额外的'Intent'。 – CommonsWare 2012-03-22 15:00:54

+0

这就是通知服务的工作原理。你必须告诉它当用户选择你的通知时启动哪个类,像这样... Intent notificationIntent = new Intent(this,someActivity.class);我会考虑传递一个未决的意图。不知道为什么我没有想到它。 – 2012-03-22 15:04:06

0

试试这个代码,

if(this instanceof Activity1) { 
    //is Acitivty 1 
} 
else if (this instanceof Acitivity2){ 
    //is Activity2 
} 
+0

这不需要我每次更新我的插件时都会产生新的灵活性吗? – 2012-03-22 15:01:35

相关问题