所以我有一个 AsyncTask 处理上传到服务器,同时调用 NotificationHelper 类来更新通知栏以显示当前上传百分比。那部分工作正常,我遇到的唯一问题是让 Action 正常工作并能够使用 Action 发送的 Intent (最近的尝试是在父 Activity 中使用广播管理器,但我从未收到消息)。如果有人能指出我正确的方向,将不胜感激。
这里是一些代码:
mNotificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
Intent intent = new Intent("com.example.sibmedemo.sibme");
intent.putExtra("message","pause");
PendingIntent pIntent = PendingIntent.getActivity(mContext, 0, intent, 0);
mBuilder = new Notification.Builder(mContext)
.setContentTitle("Upload File")
.setContentText("Upload in progress")
.setSmallIcon(R.drawable.ic_launcher)
.addAction(R.drawable.ic_launcher,"Pause",pIntent)
.addAction(R.drawable.ic_launcher,"Cancel",pIntent);
mBuilder.setProgress(100,0,false);
mNotificationManager.notify(0,mBuilder.build());
我认为我的主要问题是我没有正确理解 pendingIntents 的工作方式或它们在 android Activity 中的交换方式,任何关于此问题的澄清都会有所帮助。
--------使用解决方案后的工作代码------------ 主要 Activity ------------
public class FileUploadActivityV2 extends Activity {
public static int flags = 0;
public BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.i("message", "got a message");
if(intent.getStringExtra("message").equalsIgnoreCase("pause"))
flags = 1;
goAsync();
}
};
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_file_upload_activity_v2);
registerReceiver(receiver, new IntentFilter("sibme"));
flags = 0;
(new UploadTask(this)).execute();
}
是的,我知道我应该负责 brodcastReceiver 的生命周期,但到目前为止,这对于测试来说是可以接受的。对于任何想知道的人来说,goAsync() 函数是 Android API 的一部分,它只是声明一旦接收器调用了 onReceive 函数,回收接收器以备将来使用,以便再次使用。
在 AsyncTask 类中------------
@Override
protected Long doInBackground(Integer... integers) {
while(FileUploadActivityV2.flags == 0)
{
try{
Thread.sleep(1000);
Log.i("Running", "Running in background");
}catch(Exception e){
}
}
return null;
}
通知助手类内部------
public void createNotification() {
mNotificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
Intent intent = new Intent("sibme");
intent.putExtra("message","pause");
PendingIntent pIntent = PendingIntent.getBroadcast(mContext, 0, intent, 0);
mBuilder = new Notification.Builder(mContext)
.setContentTitle("Upload File")
.setContentText("Upload in progress")
.setSmallIcon(R.drawable.ic_launcher)
.addAction(R.drawable.ic_launcher,"Pause",pIntent)
.addAction(R.drawable.ic_launcher,"Cancel",pIntent);
mBuilder.setProgress(100,0,false);
mNotificationManager.notify(0,mBuilder.build());
}
最佳答案
了解 PendingIntent 很重要。这是 Android 拥有的强大组件之一,可用于通知操作处理之外的许多用途。
您可以将待定 Intent 视为代表您要执行的操作(发送广播/启动 Activity/启动服务)+ 执行此操作的 Intent 的对象。它的强大之处在于,您可以向另一个进程/应用程序提供待处理的 Intent (在您的情况下,另一个进程是操作系统 NotificationManager),这样您就可以让另一个进程能够唤醒您的应用程序,并且自动为您启动您提供的 Intent 和未决 Intent 。
因此,挂起的 Intent 以某种方式在通知中用作“远程监听器”,它不必为了检测事件而运行(在您的情况下,事件是通知按钮单击)
由于 PendingIntent 作为在不同应用程序之间共享的对象的性质 - 您可以通过静态方法 (PendingIntent.getService()/ 获取引用/创建新对象>PendingIntent.getActivity() 等等)返回给您新的实例或系统管理的现有实例。
让我们开始您的代码:
通过调用 PendingIntent.getActivity(),您可以创建待定 Intent ,AlarmManager 可以启动您在 Intent 中提供的特定 Activity (在您的案例中为“com.example.sibmedemo.sibme”)。我猜您想对暂停和取消操作做出不同的 react 。 这就是为什么您需要为每一个不同的待定 Intent 。您可以通过不止一种方式区分这两个操作:
无论如何 - 您必须创建不同的 Intent ,因此 - 两个不同的待定 Intent 来表示您要为不同的操作执行的不同操作。
希望它对您有所帮助,也许对其他人也有帮助。
关于android - 从通知栏与 AsyncTask 交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22125098/
大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje
这可能是个愚蠢的问题。但是,我是一个新手......你怎么能在交互式rubyshell中有多行代码?好像你只能有一条长线。按回车键运行代码。无论如何我可以在不运行代码的情况下跳到下一行吗?再次抱歉,如果这是一个愚蠢的问题。谢谢。 最佳答案 这是一个例子:2.1.2:053>a=1=>12.1.2:054>b=2=>22.1.2:055>a+b=>32.1.2:056>ifa>b#Thecode‘if..."startsthedefinitionoftheconditionalstatement.2.1.2:057?>puts"f
有人知道在发布新版本的Ruby和Rails时收到电子邮件的方法吗?他们有邮件列表,RubyonRails有一个推特,但我不想听到那些随之而来的喧嚣,我只想知道什么时候发布新版本,尤其是那些有安全修复的版本。 最佳答案 从therailsblog获取提要.http://weblog.rubyonrails.org/feed/atom.xml 关于ruby-on-rails-如何在发布新的Ruby或Rails版本时收到通知?,我们在StackOverflow上找到一个类似的问题:
最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路
我们正在开发一个需要推送通知的WP8应用程序。为了测试它,我们使用CURL命令行运行推送通知POST请求,确保它实际连接,使用客户端SSL证书进行身份验证并发送正确的数据。我们确实知道,当我们收到对设备的推送时,这项工作是有效的。这是我们一直用于测试目的的CURL命令:curl--certclient_cert.pem-v-H"Content-Type:text/xml"-H"X-WindowsPhone-Target:Toast"-H"X-NotificationClass:2"-XPOST-d"MytitleMysubtitle"https://db3.notify.live.ne
我在nginx+unicorn后面运行一系列Rails/Sinatra应用程序,零停机部署。我喜欢这个设置,但Unicorn需要一段时间才能完成重新启动,所以我想在完成时发送某种通知。我能在Unicorn文档中找到的唯一回调与workerfork相关,但我认为这些回调对此不起作用。这是我从赏金中寻找的东西:老unicorn主人启动新主人,然后新主人开始它的worker,然后旧主人停止它的worker并让新主人接管。我想在交接完成后执行一些ruby代码。理想情况下,我不想为此实现任何复杂的流程监控。如果这是唯一的方法,那就这样吧。但在走那条路之前,我正在寻找更简单的选择。
我一直试图在这里寻找答案,但我找不到任何有用的东西。我已经对我的Rails应用程序实现了:success和:dangerflash通知。它工作得很好,即:success是绿色的,:danger是红色的,有一个关闭按钮等等,但是自从添加了一些邮件文件后,我的:success现在显示为红色?application.html.erb摘录:×contact_mailer.rbclassContactMailercontacts_controller.rbclassContactsController还有,contact_email.html.erbNewMessagefromHoo
我已更新到Rails2.3.10、Rack1.2.1,现在我的所有即时消息都没有显示。我发现在重定向期间,通知是这样传递的redirect_to(@user,:notice=>"Sorrytherewasanerror")在我看来闪存哈希是空的!map:ActionController::Flash::FlashHash{}但是您可以在Controller中看到该消息。是什么原因?session{:home_zip=>"94108",:session_id=>"xxx",:flash=>{:notice=>"Sorrytherewasanerror"},:user_credential
据我了解,在Ruby和Perl之间没有“桥梁”可以让您直接从Ruby调用Perl函数。据我了解,要从Ruby调用Perl程序,只需将其放在反引号中(即result=`./helloWorld.pl`)。但是,这不允许与Perl程序交互(即您不能与提示交互或提供输入)。我的问题如下:有没有什么方法可以从Ruby向Perl程序提供输入(除了参数)?Ruby和Perl之间没有桥梁,我错了吗?在导航提示时与程序的标准输入交互似乎是错误的方式,我正在处理的程序设计良好,并且具有包含适当Perl函数的库。 最佳答案 有Inline::Ruby模
在我采用Ruby语言的过程中,我花了很多时间在IRb中。太棒了!但是,由于我不是很清楚它的功能,并且对Ruby仍然是个“笨蛋”,所以我想知道以下内容:如何在不重新启动IRb的情况下“刷新”session(或者这是不可能的)。如何配置IRb加载一堆源文件“hello.rb”和“hello_objects.rb”,即在启动时?我在这些方面投入了大量工作,如果知道加载这些类的速记,而无需再次为每个类手动键入“加载”,那就太好了。 最佳答案 我不确定是否可以“刷新”session。但是,您可以像这样加载您的类:irb-r'hello.rb'