5. Bell Number

本文深入探讨了贝尔数的概念,即n个元素集合的所有划分方式的数量,并详细讲解了斯特林第二类数的计算方法,斯特林第二类数是贝尔数计算中不可或缺的一部分。
package com.weishitechsub.kdcxqwb.fragment.Adapter; import android.Manifest; import android.app.AlertDialog; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.net.Uri; import android.os.Build; import android.os.Handler; import android.os.Looper; import android.provider.Settings; import android.text.TextUtils; import android.util.Log; import android.view.View; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.Toast; import androidx.annotation.NonNull; import androidx.core.content.ContextCompat; import com.chad.library.adapter.base.BaseQuickAdapter; import com.chad.library.adapter.base.viewholder.BaseViewHolder; import com.weishitechsub.kdcxqwb.R; import com.weishitechsub.kdcxqwb.bean.ListBean; import com.weishitechsub.kdcxqwb.utils.OnMultiClickListener; import com.weishitechsub.kdcxqwb.utils.PackageNotificationSender; import java.util.List; public class MyCourierAdapter extends BaseQuickAdapter<ListBean, BaseViewHolder> { private static final String TAG = "MyCourierAdapter"; private List<ListBean> mTrackList; private Context context; public MyCourierAdapter(List<ListBean> list, Context context) { super(R.layout.my_courier_adapter,list); this.context = context; } @Override protected void convert(@NonNull BaseViewHolder baseViewHolder, ListBean dataBean) { baseViewHolder.setText(R.id.tv_number,dataBean.getNum()); baseViewHolder.setText(R.id.tv_address,dataBean.getContext()); String state = dataBean.getState(); if (state != null) { if (state.equals("0")) { baseViewHolder.setText(R.id.tv_state,"在途"); }else if ((state.equals("5"))){ baseViewHolder.setText(R.id.tv_state,"派件"); }else if ((state.equals("3"))){ baseViewHolder.setText(R.id.tv_state,"签收"); }else if ((state.equals("6"))){ baseViewHolder.setText(R.id.tv_state,"退回"); }else if ((state.equals("4"))){ baseViewHolder.setText(R.id.tv_state,"退签"); }else { baseViewHolder.setText(R.id.tv_state,"转投"); } } if (dataBean.getType() != null) { String trackName = getTrackName(dataBean.getType()); baseViewHolder.setText(R.id.tv_type,trackName); ImageView logo = baseViewHolder.getView(R.id.iv_logo); LinearLayout line = baseViewHolder.getView(R.id.line); if (trackName.equals("邮政快递包裹")) { baseViewHolder.setImageResource(R.id.iv_logo,R.mipmap.img_yz_bg); logo.setVisibility(View.VISIBLE); line.setVisibility(View.GONE); }else if (trackName.equals("京东物流")){ baseViewHolder.setImageResource(R.id.iv_logo,R.mipmap.img_jd_bg); logo.setVisibility(View.VISIBLE); line.setVisibility(View.GONE); }else if (trackName.equals("圆通快递")){ baseViewHolder.setImageResource(R.id.iv_logo,R.mipmap.img_yt_bg); logo.setVisibility(View.VISIBLE); line.setVisibility(View.GONE); }else if (trackName.equals("中通快递")){ baseViewHolder.setImageResource(R.id.iv_logo,R.mipmap.img_zt_bg); logo.setVisibility(View.VISIBLE); line.setVisibility(View.GONE); }else if (trackName.equals("顺丰速运")){ baseViewHolder.setImageResource(R.id.iv_logo,R.mipmap.img_sf_bg); logo.setVisibility(View.VISIBLE); line.setVisibility(View.GONE); }else if (trackName.equals("韵达快递")){ baseViewHolder.setImageResource(R.id.iv_logo,R.mipmap.img_yd_bg); logo.setVisibility(View.VISIBLE); line.setVisibility(View.GONE); }else if (trackName.equals("申通快递")){ baseViewHolder.setImageResource(R.id.iv_logo,R.mipmap.img_st_bg); logo.setVisibility(View.VISIBLE); line.setVisibility(View.GONE); }else if (trackName.equals("EMS")){ baseViewHolder.setImageResource(R.id.iv_logo,R.mipmap.img_ems_bg); logo.setVisibility(View.VISIBLE); line.setVisibility(View.GONE); }else { baseViewHolder.setText(R.id.tv_name,trackName); logo.setVisibility(View.GONE); line.setVisibility(View.VISIBLE); } } baseViewHolder.getView(R.id.iv_remind).setOnClickListener(new OnMultiClickListener() { @Override public void onMultiClick(View v) { ListBean item = dataBean; String number = item.getNum(); String type = item.getType(); String companyName = getTrackName(type); // 检查通知权限 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { // Android 13+ if (ContextCompat.checkSelfPermission(context, Manifest.permission.POST_NOTIFICATIONS) != PackageManager.PERMISSION_GRANTED) { new AlertDialog.Builder(context) .setTitle("需要通知权限") .setMessage("请允许本应用发送快递到达通知,以便及时提醒您取件。\n\n进入【设置】→【通知】中开启权限。") .setPositiveButton("去开启", (dialog, which) -> { Intent intent = new Intent(); intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); intent.setData(Uri.fromParts("package", context.getPackageName(), null)); context.startActivity(intent); }) .setNegativeButton("取消", null) .show(); return; } } // 权限已授予,继续执行提醒逻辑 Log.d(TAG, "用户点击【提醒】按钮: 快递单号=" + number + ", 公司编码=" + type + ", 公司名称=" + companyName); Toast.makeText(v.getContext(), "已设置提醒: " + number, Toast.LENGTH_SHORT).show(); PackageNotificationSender sender = new PackageNotificationSender(context); sender.sendPickupReminder(number, companyName); startDeliveryPolling(context, number, companyName); } }); } public void setTrackList(List<ListBean> list){ mTrackList = list; } private String getTrackName(String type){ if (mTrackList != null) { for (ListBean item : mTrackList){ if (item.getNum()!= null && type != null ) { if(TextUtils.equals(item.getNum(),type)){ return item.getCom(); } } } } return ""; } private void startDeliveryPolling(Context context, String number, String companyName) { Log.d(TAG, "开始轮询快递状态: 单号=" + number + ", 公司=" + companyName); Handler handler = new Handler(Looper.getMainLooper()); Runnable pollingTask = new Runnable() { int count = 0; boolean arrived = false; @Override public void run() { if (arrived) { Log.d(TAG, "快递已到达,停止轮询: " + number); return; } if (count > 10) { Log.w(TAG, "轮询超过最大次数,停止: " + number); return; } count++; Log.d(TAG, "第 " + count + " 次轮询检查快递状态: " + number); // 模拟第3次轮询时到达 if (count == 3) { arrived = true; Log.i(TAG, "🎉 快递已到达!单号: " + number); PackageNotificationSender sender = new PackageNotificationSender(context); sender.sendPickupReminder(number, companyName); Toast.makeText(context, "快递 " + number + " 已到达!", Toast.LENGTH_LONG).show(); } else { // 继续下一次轮询 Log.d(TAG, "快递未到达," + 10 + "秒后再次检查..."); handler.postDelayed(this, 10000); // 10秒查一次(演示用) } } }; // 首次延迟10秒执行 handler.postDelayed(pollingTask, 10000); } } package com.weishitechsub.kdcxqwb.utils; import android.app.NotificationChannel; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.os.Build; import androidx.core.app.NotificationCompat; import androidx.core.app.NotificationManagerCompat; import com.weishitechsub.kdcxqwb.R; import com.weishitechsub.kdcxqwb.MainActivity; public class PackageNotificationSender { // 在类顶部定义 TAG,方便过滤日志 private static final String TAG = "MyCourierAdapter"; private static final String CHANNEL_ID = "delivery_reminder_channel"; private static final int NOTIFICATION_ID = 1000; private final Context context; public PackageNotificationSender(Context context) { this.context = context.getApplicationContext(); createNotificationChannel(); } private void createNotificationChannel() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { CharSequence name = "快递提醒"; String description = "当快递到达时发出通知"; int importance = NotificationManager.IMPORTANCE_HIGH; NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance); channel.setDescription(description); NotificationManager notificationManager = context.getSystemService(NotificationManager.class); notificationManager.createNotificationChannel(channel); } } public void sendPickupReminder(String number, String company) { Intent intent = new Intent(context, MainActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_IMMUTABLE); String title = "📦 快递待取件"; String content = "您的快递 " + number + "(" + company + ")已到达,请及时取件!"; NotificationCompat.Builder builder = new NotificationCompat.Builder(context, CHANNEL_ID) .setSmallIcon(R.mipmap.img_icon) // 替换为你自己的图标 .setContentTitle(title) .setContentText(content) .setPriority(NotificationCompat.PRIORITY_HIGH) .setContentIntent(pendingIntent) .setAutoCancel(true) .setDefaults(NotificationCompat.DEFAULT_ALL); NotificationManagerCompat.from(context).notify(NOTIFICATION_ID + number.hashCode(), builder.build()); } } iv_remind这个控件有两个状态,一个是开启,一个是关闭,开启设置提醒,关闭的话就关闭提醒
最新发布
11-28
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值