gpt4 book ai didi

android - 从通知栏与 AsyncTask 交互

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:48:30 26 4
gpt4 key购买 nike

所以我有一个 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 。您可以通过不止一种方式区分这两个操作:

  • 启动不同的 Activity/服务或为它们中的每一个发送广播(PendingIntent.getBroadcast())
  • 开始相同的 Activity ,但使用 different request code

无论如何 - 您必须创建不同的 Intent ,因此 - 两个不同的待定 Intent 来表示您要为不同的操作执行的不同操作。

希望它对您有所帮助,也许对其他人也有帮助。

关于android - 从通知栏与 AsyncTask 交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22125098/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com