简介:
需求:app根据复制的口令自动弹出商品详情弹框,点击弹框跳转对应的商品详情。(淘宝口令)
image.png
步骤一:
编写service,记得在manifest.xml中注册。
package com.example.xy.service;
import android.app.Service;
import android.content.Intent;
import android.graphics.Color;
import android.os.Handler;
import android.os.IBinder;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import com.blankj.utilcode.util.ToastUtils;
import com.bumptech.glide.Glide;
import com.example.xy.MainActivity;
import com.example.xy.R;
import com.example.xy.base.Response;
import com.example.xy.domain.ProductDialogData;
import com.example.xy.mall.purchase.ProductDetailsActivity;
import com.example.xy.popup.PreferBackPopup;
import com.example.xy.popup.ProductShareCodePopup;
import com.example.xy.utils.AppSharedPreferences;
import com.example.xy.utils.Constant;
import com.example.xy.utils.clipboard.ClipBoardUtil;
import com.hjq.shape.view.ShapeTextView;
import com.kongzue.dialogx.dialogs.CustomDialog;
import com.kongzue.dialogx.interfaces.OnBindView;
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
import razerdp.basepopup.BasePopupWindow;
import rxhttp.RxHttp;
public class ListenClipBoardService extends Service {
private Runnable runnable;
private Handler handler;
public ListenClipBoardService() {
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
}
private void getData() {
new Thread(new Runnable() {
@Override
public void run() {
try{
//检查剪贴板内容
getClipboardData();
}catch(Exception e){
e.printStackTrace();
}
}
}).start();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
getData();
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
}
/**
* 获取剪贴板内容
*/
private void getClipboardData() {
String tem = ClipBoardUtil.paste();
if(tem != null && !tem.isEmpty()){
ToastUtils.showShort(tem);
//先调用请求再展示弹框
// showProductDialog();
requestProductDetail(tem);
ClipBoardUtil.clear();
}
}
private void showProductDialog(ProductDialogData.Data data){
CustomDialog.build().setMaskColor(Color.parseColor("#4D000000"))
.setCustomView(new OnBindView<CustomDialog>(R.layout.popup_product_share_code) {
@Override
public void onBind(CustomDialog dialog, View v) {
ImageView ivClose = v.findViewById(R.id.iv_close);
ImageView avatar = v.findViewById(R.id.iv_avatar);
TextView nickName = v.findViewById(R.id.tv_nickName);
ImageView cover = v.findViewById(R.id.iv_product);
ShapeTextView stvDetail = v.findViewById(R.id.stv_detail);
TextView price = v.findViewById(R.id.tv_price);
TextView title = v.findViewById(R.id.tv_title);
Glide.with(v).load(data.avatar).into(avatar);
nickName.setText(data.nickName);
Glide.with(v).load(data.image).into(cover);
price.setText(data.price.toString());
title.setText(data.productName);
ivClose.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
}
});
stvDetail.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//发送广播
Intent intent = new Intent("com.example.ACTION_JUMP_TO_ACTIVITY");
intent.putExtra("PRODUCT_ID",data.id);
sendBroadcast(intent);
}
});
}
}).setAlign(CustomDialog.ALIGN.CENTER).show();
}
private void requestProductDetail(String code){
RxHttp.get(Constant.PRODUCT_CODE)
.setDomainToTestUrlIfAbsent()
.addHeader(Constant.TOKEN, AppSharedPreferences.getInstance(this).getToken())
.add("code", code)
.asClass(ProductDialogData.class)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(a -> {
if (a.getStatus() == 200) {
showProductDialog(a.getData());
} else {
}
}
, throwable -> {
Log.e("商品分销弹框异常", "error:" + throwable);
throwable.printStackTrace();
});
}
}
剪贴板工具类
package com.example.xy.utils.clipboard;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.text.TextUtils;
import com.example.xy.BaseApp;
/**
* 剪切板读写工具
*/
public class ClipBoardUtil {
/**
* 获取剪切板内容
* @return
*/
public static String paste(){
ClipboardManager manager = (ClipboardManager) BaseApp.getBaseApp().getSystemService(Context.CLIPBOARD_SERVICE);
if (manager != null) {
if (manager.hasPrimaryClip() && manager.getPrimaryClip().getItemCount() > 0) {
CharSequence addedText = manager.getPrimaryClip().getItemAt(0).getText();
String addedTextString = String.valueOf(addedText);
if (!TextUtils.isEmpty(addedTextString)) {
return addedTextString;
}
}
}
return "";
}
/**
* 清空剪切板
*/
public static void clear(){
ClipboardManager manager = (ClipboardManager) BaseApp.getBaseApp().getSystemService(Context.CLIPBOARD_SERVICE);
if (manager != null) {
try {
manager.setPrimaryClip(manager.getPrimaryClip());
manager.setPrimaryClip(ClipData.newPlainText("",""));
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 将文本放入剪贴板
*/
public static void putTextClipBoard(String text){
ClipboardManager manager = (ClipboardManager) BaseApp.getBaseApp().getSystemService(Context.CLIPBOARD_SERVICE);
if (manager != null) {
try {
manager.setPrimaryClip(ClipData.newPlainText("",text));
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
步骤二:
到application的入口类中,然后在全局的activity生命周期中注册和卸载该服务,使用动态注册广播的方式进行跳转,因为service不支持跳转。
private BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// 执行页面跳转操作
// ToastUtils.showShort("触发广播");
Intent jumpIntent = new Intent(getBaseApp(), ProductDetailsActivity.class);
if(intent.getIntExtra("PRODUCT_ID", -1) != -1){
jumpIntent.putExtra("PRODUCT_ID",intent.getIntExtra("PRODUCT_ID", -1));
jumpIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(jumpIntent);
}
}
};
//在onCreate方法中添加生命周期管理
registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
@Override
public void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) {
// activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
@Override
public void onActivityStarted(@NonNull Activity activity) {
//开启
Intent intent1 = new Intent(activity, DetectRootService.class);
startService(intent1);
//开启
Intent intent2 = new Intent(activity, ListenClipBoardService.class);
startService(intent2);
}
@Override
public void onActivityResumed(@NonNull Activity activity) {
if (receiver != null) {
IntentFilter filter = new IntentFilter("com.example.ACTION_JUMP_TO_ACTIVITY");
registerReceiver(receiver, filter);
}
}
@Override
public void onActivityPaused(@NonNull Activity activity) {
}
@Override
public void onActivityStopped(@NonNull Activity activity) {
}
@Override
public void onActivitySaveInstanceState(@NonNull Activity activity, @NonNull Bundle outState) {
}
@Override
public void onActivityDestroyed(@NonNull Activity activity) {
//关闭服务
Intent intent2 = new Intent(activity, ListenClipBoardService.class);
stopService(intent2);
}
});
补充:
上架时出现隐私不合规的情况,在service中的获取剪贴板功能需要进行限制,不能一直处于获取剪贴板的状态。改动如下
public class ListenClipBoardService extends Service {
/**
* 获取剪贴板内容
*/
private void getClipboardData() {
if(ClipBoardUtil.CLIPBOARD_PERMISSION){
String tem = ClipBoardUtil.paste();
if(tem != null && !tem.isEmpty()){
requestProductDetail(tem);
ClipBoardUtil.clear();
ClipBoardUtil.CLIPBOARD_PERMISSION = false;
}
}else{
// Log.e(TAG, "未获取剪贴板数据");
}
}
}
/**
* 剪切板读写工具
*/
public class ClipBoardUtil {
public static boolean CLIPBOARD_PERMISSION = false;
}
BaseApp {
ClipboardManager clipboardManager;
ClipboardManager.OnPrimaryClipChangedListener listener;
registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
@Override
public void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) {
// activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
clipboardManager = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
listener = new ClipboardManager.OnPrimaryClipChangedListener() {
@Override
public void onPrimaryClipChanged() {
// 剪贴板内容发生变化时的处理逻辑
ClipData clipData = clipboardManager.getPrimaryClip();
if (clipData != null && clipData.getItemCount() > 0) {
ClipData.Item item = clipData.getItemAt(0);
CharSequence text = item.getText();
if (text != null) {
String clipboardText = text.toString();
ClipBoardUtil.CLIPBOARD_PERMISSION = true;
}
}
}
};
}
@Override
public void onActivityStarted(@NonNull Activity activity) {
//开启
Intent intent1 = new Intent(activity, DetectRootService.class);
startService(intent1);
//注册监听
clipboardManager.addPrimaryClipChangedListener(listener);
//闪屏页,启动页不开启服务
if(activity instanceof BasicFunActivity || activity instanceof NewGuideActivity || activity instanceof SplashActivity){
}else{
//开启
Intent intent2 = new Intent(activity, ListenClipBoardService.class);
startService(intent2);
}
}
@Override
public void onActivityResumed(@NonNull Activity activity) {
if (RootUtil.isRoot) {
//检查RootUtil的状态,如果当前为root环境,弹出弹框警告
CustomDialog.build().setMaskColor(Color.parseColor("#4D000000"))
.setCustomView(new OnBindView<CustomDialog>(R.layout.dialog_address_delete) {
@Override
public void onBind(CustomDialog dialog, View v) {
TextView tv_content = v.findViewById(R.id.tv_content);
TextView tv_delete = v.findViewById(R.id.stv_delete);
TextView tv_cancel = v.findViewById(R.id.stv_cancel);
TextView title = v.findViewById(R.id.title);
tv_delete.setText("确定");
tv_content.setText("App在不安全环境中运行");
title.setText("警告");
tv_cancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
v.setClickable(false);
v.setEnabled(false);
dialog.dismiss();
}
});
tv_delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
v.setClickable(false);
v.setEnabled(false);
dialog.dismiss();
}
});
}
}).setAlign(CustomDialog.ALIGN.CENTER).show();
}
if (receiver != null) {
IntentFilter filter = new IntentFilter("com.example.ACTION_JUMP_TO_ACTIVITY");
registerReceiver(receiver, filter);
}
}
@Override
public void onActivityPaused(@NonNull Activity activity) {
}
@Override
public void onActivityStopped(@NonNull Activity activity) {
}
@Override
public void onActivitySaveInstanceState(@NonNull Activity activity, @NonNull Bundle outState) {
}
@Override
public void onActivityDestroyed(@NonNull Activity activity) {
//关闭服务
Intent intent1 = new Intent(activity, DetectRootService.class);
stopService(intent1);
//关闭服务
Intent intent2 = new Intent(activity, ListenClipBoardService.class);
stopService(intent2);
//移除剪贴板监听
clipboardManager.removePrimaryClipChangedListener(listener);
}
});
}
网友评论