以编程方式单击Android通知

以编程方式单击Android通知,android,android-intent,android-activity,robotium,android-notifications,Android,Android Intent,Android Activity,Robotium,Android Notifications,我正在使用黑盒测试应用程序。 每次我安装新应用程序时,测试中的应用程序都会在状态栏中发送通知。 我想点击这个通知,但我仍然没有找到一个合适的方式来做 当我手动单击一个通知时,我得到以下logcat行: I/ActivityManager( 148): START {flg=0x14000000 cmp=com.test.package/.activity.FrontActivity bnds=[0,38][240,86] (has extras) u=0} from pid -1 I/Acti

我正在使用黑盒测试应用程序。 每次我安装新应用程序时,测试中的应用程序都会在状态栏中发送通知。 我想点击这个通知,但我仍然没有找到一个合适的方式来做

当我手动单击一个通知时,我得到以下
logcat
行:

I/ActivityManager(  148): START {flg=0x14000000 cmp=com.test.package/.activity.FrontActivity bnds=[0,38][240,86] (has extras) u=0} from pid -1
I/ActivityManager(  148): START {flg=0x14000000 cmp=com.test.package/.activity.ResultActivity u=0} from pid 8600
I/ActivityManager(  148): Displayed com.test.package/.activity.FrontActivity: +1s183ms
I/ActivityManager(  148): Displayed com.test.package/.activity.ResultActivity: +744ms
我知道Robotium无法同时测试两个不同的应用程序,我也知道您无法获得外部应用程序的通知

我还尝试使用以下代码获取挂起的意图并启动它:

Context context = this.getInstrumentation().getTargetContext().getApplicationContext();
String intentClassString = "com.test.package.activity.FrontActivity";
Class<?> intentClass = null;

try {
    intentClass = Class.forName(intentClassString);
} catch (ClassNotFoundException e) {
    e.printStackTrace();
}

Intent intent = new Intent(context, intentClass);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_NO_CREATE);

try {
    pendingIntent.send();
} catch (CanceledException e) {
    e.printStackTrace();
}
Context Context=this.getInstrumentation().getTargetContext().getApplicationContext();
String intentClassString=“com.test.package.activity.FrontActivity”;
类intentClass=null;
试一试{
intentClass=Class.forName(intentClassString);
}catch(classnotfounde异常){
e、 printStackTrace();
}
意向意向=新意向(上下文、意向类);
PendingEvent PendingEvent=PendingEvent.getActivity(上下文,0,意图,PendingEvent.FLAG_NO_CREATE);
试一试{
pendingent.send();
}捕获(取消异常e){
e、 printStackTrace();
}
该活动实际上是显示的,但它与我通过手动调用它获得的内容不同。我认为在我传递的上下文中,或者在我称之为未决意图的方式中,有些事情是错误的


关于这个问题有什么提示吗?有没有更好的方法来模拟点击通知?

请在另一个stackoverflow问题中找到好的讨论和一些选项:


因为您已经有了激发意图的代码,所以不要尝试重新创建notify()调用所做的操作,而是尝试添加一个特殊的活动,用于测试在通知上实际调用notify()。

您可以触发在通知栏上的滑动,并点击通知上的事件

参考命令:

adb shell input swipe 100 500 400 100 1000

adb shell input tap 400 400

通过更改参数,您可以使用这些命令。

Ranjith KP给出的答案包含解决方案。请注意,您需要运行应用程序的手机,因为这些是sudo privileges使用的命令

这是为我工作的代码。它首先扩展通知栏(滑动命令),等待1秒,最后点击列表上的第一个通知。根据需要修改轴参数

Process su = null;
try {
 su = Runtime.getRuntime().exec("su");
 su.getOutputStream().write("input swipe 270 010 270 900\n".getBytes());
 Thread.sleep(1000);
 su.getOutputStream().write("input tap 200 200\n".getBytes());
 su.getOutputStream().write("exit\n".getBytes());
 su.waitFor();
} catch (Exception e) {
 e.printStackTrace();
} finally {
 if (su != null) {
  su.destroy();
 }
}