前言
百度下找資料發(fā)現(xiàn)居然有人分享了文章還要收錢才能看狈究,氣不過,自己寫個(gè)分享安拟,路過的覺得有用點(diǎn)個(gè)贊
近期開發(fā)遇到開發(fā)的一個(gè)功能蛤吓,跟淘寶的分享鏈接一樣,復(fù)制完分享鏈接后分享給別人糠赦,打開我們的APP要彈窗去做下一步操作会傲。這里有個(gè)要注意的地方,怎么區(qū)分是在自己的app復(fù)制還是在別的app復(fù)制拙泽。
第一步
復(fù)制
/**
*
* @param context Context
* @param string String 復(fù)制的內(nèi)容
* @param action Function0<Unit>? 復(fù)制完成后執(zhí)行的方法
*/
fun copyClip(context: Context, string: String, action: (() -> Unit)?) {
try {
val mClipData = ClipData.newPlainText("Label", string)
(context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager?)?.run {
setPrimaryClip(mClipData)
action?.invoke()
}
} catch (e: Exception) {
e.printStackTrace()
}
}
注意 這里的“Label”是關(guān)鍵淌山,判斷是否是自己app復(fù)制的就靠這個(gè)字段
第二步
獲取復(fù)制的內(nèi)容
fun getClipData():Boolean{
try {
val cm = UIUtils.getContext().getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
if (cm.hasPrimaryClip() && cm.primaryClip?.itemCount!! >0 && cm.hasText()) {
val label = cm.primaryClip!!.description.label
if ("Label" == label) { //通過先前設(shè)置的字段來判斷是否是在自己的app復(fù)制
//來自自己app的復(fù)制內(nèi)容
Log.d(TAG, "ClipboardManager:" + "來自自己app的復(fù)制內(nèi)容")
return false
} else {
val data = cm.primaryClip
val item = data!!.getItemAt(0)
val content = item.text.toString()
if (content.isNotEmpty()){
Log.d(TAG, "ClipboardManager:來自其他app的復(fù)制內(nèi)容--$content")
//清空剪貼板,一般獲取完數(shù)據(jù)之后需要清空
cm.setPrimaryClip(ClipData.newPlainText(null,null))
return true
}
}
}
}catch (e:Exception){
e.printStackTrace()
}
return false
}
都封裝成方法顾瞻,方便調(diào)用
第三步
一般有這種操作都需要判斷是否從后臺(tái)跳前臺(tái)泼疑,直接上代碼
package com.ugreen.nas.manager;
import android.app.Activity;
import android.app.Application;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.collection.ArrayMap;
import java.util.ArrayList;
public final class ActivityStackManager implements Application.ActivityLifecycleCallbacks {
private static volatile ActivityStackManager sInstance;
private static long startedActivityCount = 0l;
private final ArrayMap<String, Activity> mActivitySet = new ArrayMap<>();
private ArrayList<OnBackgroundListener> mOnBackgroundListeners = new ArrayList<>();
/** 當(dāng)前應(yīng)用上下文對(duì)象 */
private Application mApplication;
/** 當(dāng)前 Activity 對(duì)象標(biāo)記 */
private String mCurrentTag;
private ActivityStackManager() {}
public static ActivityStackManager getInstance() {
// 加入雙重校驗(yàn)鎖
if(sInstance == null) {
synchronized (ActivityStackManager.class) {
if(sInstance == null){
sInstance = new ActivityStackManager();
}
}
}
return sInstance;
}
public void init(Application application) {
mApplication = application;
application.registerActivityLifecycleCallbacks(this);
}
/**
* 獲取 Application 對(duì)象
*/
public Application getApplication() {
return mApplication;
}
/**
* 獲取棧頂?shù)?Activity
*/
public Activity getTopActivity() {
return mActivitySet.get(mCurrentTag);
}
/**
* 銷毀所有的 Activity
*/
public void finishAllActivities() {
finishAllActivities((Class<? extends Activity>) null);
}
/**
* 銷毀所有的 Activity,除這些 Class 之外的 Activity
*/
@SafeVarargs
public final void finishAllActivities(Class<? extends Activity>... classArray) {
String[] keys = mActivitySet.keySet().toArray(new String[]{});
for (String key : keys) {
Activity activity = mActivitySet.get(key);
if (activity != null && !activity.isFinishing()) {
boolean whiteClazz = false;
if (classArray != null) {
for (Class<? extends Activity> clazz : classArray) {
if (activity.getClass() == clazz) {
whiteClazz = true;
}
}
}
// 如果不是白名單上面的 Activity 就銷毀掉
if (!whiteClazz) {
activity.finish();
mActivitySet.remove(key);
}
}
}
}
@SafeVarargs
public final void finishSpeicActivities(Class<? extends Activity>... classArray) {
try {
String[] keys = mActivitySet.keySet().toArray(new String[]{});
for (String key : keys) {
Activity activity = mActivitySet.get(key);
if (activity != null && !activity.isFinishing()) {
boolean whiteClazz = false;
if (classArray != null) {
for (Class<? extends Activity> clazz : classArray) {
if (activity.getClass() == clazz) {
whiteClazz = true;
}
}
}
// 如果不是白名單上面的 Activity 就銷毀掉
if (whiteClazz) {
activity.finish();
mActivitySet.remove(key);
}
}
}
}catch (Exception e){
e.printStackTrace();
}
}
/**
* 獲取一個(gè)對(duì)象的獨(dú)立無二的標(biāo)記
*/
private static String getObjectTag(Object object) {
// 對(duì)象所在的包名 + 對(duì)象的內(nèi)存地址
return object.getClass().getName() + Integer.toHexString(object.hashCode());
}
@Override
public void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) {
mCurrentTag = getObjectTag(activity);
mActivitySet.put(getObjectTag(activity), activity);
}
@Override
public void onActivityStarted(@NonNull Activity activity) {
mCurrentTag = getObjectTag(activity);
startedActivityCount++;
if (1 == startedActivityCount) {
for (OnBackgroundListener onBackgroundListener : mOnBackgroundListeners) {
onBackgroundListener.onActivityChanged(false);
}
}
}
@Override
public void onActivityResumed(@NonNull Activity activity) {
mCurrentTag = getObjectTag(activity);
}
@Override
public void onActivityPaused(@NonNull Activity activity) {}
@Override
public void onActivityStopped(@NonNull Activity activity) {
startedActivityCount--;
if (0 == startedActivityCount) {
for (OnBackgroundListener onBackgroundListener : mOnBackgroundListeners) {
onBackgroundListener.onActivityChanged(true);
}
}
}
@Override
public void onActivitySaveInstanceState(@NonNull Activity activity, @NonNull Bundle outState) {}
@Override
public void onActivityDestroyed(@NonNull Activity activity) {
mActivitySet.remove(getObjectTag(activity));
if (getObjectTag(activity).equals(mCurrentTag)) {
// 清除當(dāng)前標(biāo)記
mCurrentTag = null;
}
}
public interface OnBackgroundListener {
void onActivityChanged(boolean background);
}
public void registerObserver(OnBackgroundListener observer) {
if (!mOnBackgroundListeners.contains(observer)) {
mOnBackgroundListeners.add(observer);
}
}
public void unregisterObserver(OnBackgroundListener observer) {
mOnBackgroundListeners.remove(observer);
}
}
怎么調(diào)用
ActivityStackManager.getInstance().registerObserver(new ActivityStackManager.OnBackgroundListener() {
@Override
public void onActivityChanged(boolean background) {
Log.d(TAG, "background:" + (background ? "后臺(tái)" : "前臺(tái)"));
if (!background) {
//這里去處理你的邏輯
}
}
});
到這里就基本都搞定了朋其,剩余的一些自己的邏輯就自己處理