设为首页 收藏本站
查看: 993|回复: 0

[经验分享] android 短信通知和SQLITE 应用

[复制链接]

尚未签到

发表于 2016-11-30 11:50:31 | 显示全部楼层 |阅读模式
  最近有需求做个一手机开机后,监听手机短信(指定短信内容)通知客户。下面将实现代码写出来
  短信通知广播拦截BootReceiver

package com.msi.manning;
import java.util.ArrayList;
import android.app.NotificationManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.gsm.SmsMessage;
import android.util.Log;
/**
* 2011-4-18 下午01:43:17 BootReceiver.java author:zhouhui
* E-mail:wwwzhouhui@163.com
*/
public class BootReceiver extends BroadcastReceiver {
static final String ACTION = "android.provider.Telephony.SMS_RECEIVED";
private static final String LOG_TAG = "SMSReceiver";
public static final int NOTIFICATION_ID_RECEIVED = 0x1221;
@Override
public void onReceive(Context context, Intent intent) {
NotificationManager nm = (NotificationManager) context
.getSystemService(Context.NOTIFICATION_SERVICE);
ArrayList<String> list = new ArrayList<String>();
if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
// Intent in = new Intent(context, SMSNotifyActivity.class); //
// 这是你的activity
// in.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
// context.startActivity(in);
}
if (intent.getAction().equals(BootReceiver.ACTION)) {
Bundle bundle = intent.getExtras();
StringBuilder sb = new StringBuilder();
if (bundle != null) {
Object messages[] = (Object[]) bundle.get("pdus");
SmsMessage[] smsMessage = new SmsMessage[messages.length];
for (int n = 0; n < messages.length; n++) {
smsMessage[n] = SmsMessage
.createFromPdu((byte[]) messages[n]);
sb.append("From:");
sb.append(smsMessage[n].getDisplayOriginatingAddress());
sb.append("\n");
sb.append(smsMessage[n].getDisplayMessageBody());
list.add(sb.toString());
}
}
Log.i(BootReceiver.LOG_TAG, "[SMSApp] onReceiveIntent0: " + sb);
abortBroadcast();
Intent in = new Intent(context, SMSNotifyActivity.class);
Bundle bundle2 = new Bundle();
bundle2.putStringArrayList("message", list);
in.putExtras(bundle2);
in.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(in);
Log.i(BootReceiver.LOG_TAG, "[SMSApp] onReceiveIntent0over: " );
}
}
}

  手机发送短信广播后会给android.provider.Telephony.SMS_RECEIVED 拦截 取得短信内容后面通知需要显示拦截展现的Activity
  显示短信拦截内容的SMSNotifyActivity 
  package com.msi.manning;

import java.util.ArrayList;
import java.util.HashMap;
import android.app.Activity;
import android.database.Cursor;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ListView;
public class SMSNotifyActivity extends Activity {
private static final String LOG_TAG = "SMSReceiver";
Button closeBtn;
Button clearBtn;
Button deleteBtn;
ListView list;
ListViewButtonAdapter listItemAdapter;
private DiaryDbAdapter mDbHelper;
private Cursor mDiaryCursor;
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
initLayout();
}
/**
* 查詢最新全部短信通知數據
*/
private void renderListView() {
mDiaryCursor = mDbHelper.getAllMessage();
ArrayList<HashMap<String, Object>> listItem = new ArrayList<HashMap<String, Object>>();
mDiaryCursor.moveToFirst();
while (!mDiaryCursor.isAfterLast()) {
HashMap<String, Object> map = new HashMap<String, Object>();
String status = mDiaryCursor.getString(5);
if (status.equals("0")) {
status = "未查看";
} else {
status = "已查看";
}
map.put("ItemTitle", mDiaryCursor.getLong(0));
map.put("ItemType", mDiaryCursor.getString(3));
map.put("ItemTime", mDiaryCursor.getString(4));
map.put("ItemStatus", status);
map.put("ItemText", mDiaryCursor.getString(1));
listItem.add(map);
mDiaryCursor.moveToNext();
}
mDiaryCursor.close();
// 生成适配器的Item和动态数组对应的元素
listItemAdapter = new ListViewButtonAdapter(this, listItem,// 数据源
R.layout.list,// ListItem的XML实现
// 动态数组与ImageItem对应的子项
new String[] { "ItemTitle", "ItemType", "ItemTime",
"ItemStatus", "ItemText", "ItemTitle", "ItemTitle" },
// ImageItem的XML文件里面的一个ImageView,两个TextView ID
new int[] { R.id.ItemTitle, R.id.ItemType, R.id.ItemTime,
R.id.ItemStatus, R.id.ItemText, R.id.btn_config_delete,
R.id.btn_config_view }, mDbHelper);
// 添加并且显示
list.setAdapter(listItemAdapter);
}
/**
* 初始化組件
*/
private void initLayout() {
// 绑定Layout里面的ListView
list = (ListView) findViewById(R.id.MyListView);
this.closeBtn = (Button) findViewById(R.id.btn_config_close);
this.clearBtn = (Button) findViewById(R.id.btn_config_clear);
closeBtn.setOnClickListener(new closeBtn_Click());
clearBtn.setOnClickListener(new clearBtn_Click());
}
@Override
protected void onStart() {
super.onStart();
mDbHelper = new DiaryDbAdapter(this);
mDbHelper.open();
Bundle extras = getIntent().getExtras();
ArrayList<String> data = null;
if (extras != null) {
data = extras.getStringArrayList("message");
for (int j = 0; j < data.size(); j++) {
String[] array = data.get(j).split("\n");
String[] message = array[1].split("#");
mDbHelper.createDiary(message[4], message[1], message[2], "0",
message[3]);
}
}
Log.i(SMSNotifyActivity.LOG_TAG, "[SMSApp] onReceiveIntent1: " + data);
renderListView();
}
/**
* 關閉短信通知
*
* @author dell
*
*/
public class closeBtn_Click implements OnClickListener {
public void onClick(View arg0) {
SMSNotifyActivity.this.finish();
}
}
/**
* 清除所有短信通知
*
* @author dell
*
*/
public class clearBtn_Click implements OnClickListener {
public void onClick(View arg0) {
boolean flag = mDbHelper.deleteAll();
Log.i(SMSNotifyActivity.LOG_TAG, "[SMSApp] clearBtn_Click: " + flag);
listItemAdapter.notifyDataSetChanged();
// 刷新頁面
renderListView();
}
}
protected void onRestart() {
super.onRestart();
Log.e(LOG_TAG, "start onRestart~~~");
}
@Override
protected void onResume() {
super.onResume();
Log.e(LOG_TAG, "start onResume~~~");
}
@Override
protected void onPause() {
super.onPause();
Log.e(LOG_TAG, "start onPause~~~");
}
@Override
protected void onStop() {
super.onStop();
Log.e(LOG_TAG, "start onStop~~~");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.e(LOG_TAG, "start onDestroy~~~");
}
}

  短信拦截后的记录插入到数据库中,这里有个SQLlite辅助类DiaryDbAdapter
  package com.msi.manning;


import java.util.Calendar;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
public class DiaryDbAdapter {
private static final String PUSH_ID = "push_id"; //邮件等类型的主键
private static final String CONTENT = "content"; //邮件等类型的简略内容
private static final String SMS_FUNC_CODE = "sms_func_code"; //通知类型代码
private static final String SMS_FUNC_CODE_CN = "sms_func_code_cn"; //通知类型中文名
private static final String CREATE_TIME = "create_time"; //该记录创建的时间
private static final String STATUS = "status";  //通知状态
private static final String REQID = "reqid";  //通知状态
private static final String DATABASE_NAME = "dbForMessage";
private static final String DATABASE_TABLE = "iuc_push_record";
private static final int DATABASE_VERSION = 1;
private static final String TAG = "DiaryDbAdapter";
private DatabaseHelper mDbHelper;
private SQLiteDatabase mDb;
private static final String DATABASE_CREATE = "CREATE TABLE " + DATABASE_TABLE + " (" + PUSH_ID
+ " INTEGER PRIMARY KEY autoincrement, " + CONTENT + " text not null, " +SMS_FUNC_CODE + " text," + SMS_FUNC_CODE_CN + " text," +CREATE_TIME + " text," +STATUS + " text, "+REQID + " text "+ ");";
//private static final String DATABASE_CREATE = "create table diary (_id integer primary key autoincrement, "
//+ "title text not null, body text not null, created text not null);";
private final Context mCtx;
private static class DatabaseHelper extends SQLiteOpenHelper {
DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
Log.i(TAG, "[SMSApp] createDatabase: " +DATABASE_CREATE);
db.execSQL(DATABASE_CREATE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.i(TAG, "[SMSApp] updatgeDatabase: " +DATABASE_CREATE);
db.execSQL("DROP TABLE IF EXISTS"+DATABASE_TABLE);
onCreate(db);
}
}
public DiaryDbAdapter(Context ctx) {
this.mCtx = ctx;
}
public DiaryDbAdapter open() throws SQLException {
mDbHelper = new DatabaseHelper(mCtx);
mDb = mDbHelper.getWritableDatabase();
return this;
}
public void closeclose() {
mDbHelper.close();
}
public long createDiary(String content, String sms_func_code,String sms_func_code_cn,String status,String reqid) {
ContentValues initialValues = new ContentValues();
initialValues.put(CONTENT, content);
initialValues.put(SMS_FUNC_CODE, sms_func_code);
initialValues.put(SMS_FUNC_CODE_CN, sms_func_code_cn);
initialValues.put(STATUS, status);
initialValues.put(REQID, reqid);
Calendar calendar = Calendar.getInstance();
String created = calendar.get(Calendar.YEAR) + "年"
+ calendar.get(Calendar.MONTH) + "月"
+ calendar.get(Calendar.DAY_OF_MONTH) + "日"
+ calendar.get(Calendar.HOUR_OF_DAY) + "时"
+ calendar.get(Calendar.MINUTE) + "分";
initialValues.put(CREATE_TIME, created);
Log.i(TAG, "[SMSApp] insertsql: ");
return mDb.insert(DATABASE_TABLE, null, initialValues);
}
public boolean deleteDiary(long rowId) {
Log.i(TAG, "[SMSApp] deletesql: "+rowId);
return mDb.delete(DATABASE_TABLE, PUSH_ID + "=" + rowId, null) > 0;
}
public boolean deleteAll() {
Log.i(TAG, "[SMSApp] deleteallsql: ");
return mDb.delete(DATABASE_TABLE, null, null) > 0;
}
public Cursor getAllMessage() {
Log.i(TAG, "[SMSApp] getallsql: ");
return mDb.query(DATABASE_TABLE, new String[] { PUSH_ID, CONTENT,
SMS_FUNC_CODE, SMS_FUNC_CODE_CN,CREATE_TIME,STATUS,REQID }, null, null, null, null, null);
}
public Cursor getDiary(long rowId) throws SQLException {
Cursor mCursor =
mDb.query(true, DATABASE_TABLE, new String[] { PUSH_ID, CONTENT,
SMS_FUNC_CODE, SMS_FUNC_CODE_CN,CREATE_TIME,STATUS,REQID }, PUSH_ID + "=" + rowId, null, null,
null, null, null);
Log.i(TAG, "[SMSApp] getDiarysql: ");
if (mCursor != null) {
mCursor.moveToFirst();
}
return mCursor;
}
public boolean updateDiary(long rowId, String content, String sms_func_code,String sms_func_code_cn,String status,String reqid) {
ContentValues args = new ContentValues();
args.put(CONTENT, content);
args.put(SMS_FUNC_CODE, sms_func_code);
args.put(SMS_FUNC_CODE_CN, sms_func_code_cn);
args.put(STATUS, status);
args.put(REQID, reqid);
Calendar calendar = Calendar.getInstance();
String created = calendar.get(Calendar.YEAR) + "年"
+ calendar.get(Calendar.MONTH) + "月"
+ calendar.get(Calendar.DAY_OF_MONTH) + "日"
+ calendar.get(Calendar.HOUR_OF_DAY) + "时"
+ calendar.get(Calendar.MINUTE) + "分";
args.put(CREATE_TIME, created);
Log.i(TAG, "[SMSApp] updatesql: ");
return mDb.update(DATABASE_TABLE, args, PUSH_ID + "=" + rowId, null) > 0;
}
}

  由于SMSNotifyActivity 方法中listview中有按钮提交事件普通的listview不能响应事件,ListViewButtonAdapter
  扩展BaseAdapter 方法重写getView 方法,添加BUTTON 并添加按钮响应事件
  package com.msi.manning;


import java.util.ArrayList;
import java.util.HashMap;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.TextView;
/**
* 2011-4-20 上午10:56:21 lvButtonAdapter.java author:zhouhui
* E-mail:wwwzhouhui@163.com
*/
public class ListViewButtonAdapter extends BaseAdapter {
private DiaryDbAdapter mDbHelper;
private static final String TAG = "lvButtonAdapter";
public static final String ACTION_INTENT_TASKRECEIVER= "com.gift.android.TaskReceiver";
private class buttonViewHolder {
// ImageView appIcon;
TextView appName1;
TextView appName2;
TextView appName3;
TextView appName4;
TextView appName5;
Button buttonClose;
Button buttonView;
}
private ArrayList<HashMap<String, Object>> mAppList;
private LayoutInflater mInflater;
private Context mContext;
private String[] keyString;
private int[] valueViewID;
private buttonViewHolder holder;
public ListViewButtonAdapter(Context c,
ArrayList<HashMap<String, Object>> appList, int resource,
String[] from, int[] to, DiaryDbAdapter mDbHelper) {
mAppList = appList;
mContext = c;
mInflater = (LayoutInflater) mContext
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
keyString = new String[from.length];
valueViewID = new int[to.length];
System.arraycopy(from, 0, keyString, 0, from.length);
System.arraycopy(to, 0, valueViewID, 0, to.length);
this.mDbHelper = mDbHelper;
}
@Override
public int getCount() {
return mAppList.size();
}
@Override
public Object getItem(int position) {
return mAppList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
public void removeItem(int position) {
mAppList.remove(position);
this.notifyDataSetChanged();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView != null) {
holder = (buttonViewHolder) convertView.getTag();
} else {
convertView = mInflater.inflate(R.layout.list, null);
holder = new buttonViewHolder();
holder.appName1 = (TextView) convertView
.findViewById(valueViewID[0]);
holder.appName2 = (TextView) convertView
.findViewById(valueViewID[1]);
holder.appName3 = (TextView) convertView
.findViewById(valueViewID[2]);
holder.appName4 = (TextView) convertView
.findViewById(valueViewID[3]);
holder.appName5 = (TextView) convertView
.findViewById(valueViewID[4]);
holder.buttonClose = (Button) convertView
.findViewById(valueViewID[5]);
holder.buttonView = (Button) convertView
.findViewById(valueViewID[6]);
convertView.setTag(holder);
}
HashMap<String, Object> appInfo = mAppList.get(position);
if (appInfo != null) {
Long aname1 = (Long) appInfo.get(keyString[0]);
String aname2 = (String) appInfo.get(keyString[1]);
String aname3 = (String) appInfo.get(keyString[2]);
String aname4 = (String) appInfo.get(keyString[3]);
String aname5 = (String) appInfo.get(keyString[4]);
holder.appName1.setText(String.valueOf(aname1));
holder.appName2.setText(aname2);
holder.appName3.setText(aname3);
holder.appName4.setText(aname4);
holder.appName5.setText(aname5);
holder.buttonClose
.setOnClickListener(new lvButtonListener(position));
holder.buttonView
.setOnClickListener(new lvButtonListener(position));
}
return convertView;
}
class lvButtonListener implements OnClickListener {
private int position;
lvButtonListener(int pos) {
position = pos;
}
@Override
public void onClick(View v) {
int vid = v.getId();
if (vid == holder.buttonClose.getId()) {
boolean flag = mDbHelper.deleteDiary(Long
.parseLong((holder.appName1.getText().toString())));
Log.i(TAG, "[SMSApp] deletesql: " + flag);
removeItem(position);
}
if (vid == holder.buttonView.getId()) {
// 查看短信详细
ShowView(Long.parseLong((holder.appName1.getText().toString())));
}
}
private void ShowView(long id) {
Cursor mDiaryCursor = mDbHelper.getDiary(id);
if (mDiaryCursor != null) {
boolean flag = mDbHelper.updateDiary(id,
mDiaryCursor.getString(1), mDiaryCursor.getString(2),
mDiaryCursor.getString(3), "1",mDiaryCursor.getString(6));
Log.i(TAG, "[SMSApp] updatesql: " + flag);
// 广播消息
Intent intent = new Intent(ACTION_INTENT_TASKRECEIVER);
intent.putExtra("TaskContent", mDiaryCursor.getString(2)+"#"+mDiaryCursor.getString(6));
mContext.sendBroadcast(intent);
}
}
}
}

  layout 文件的布局管理文件
  main.xml
  <?xml version="1.0" encoding="utf-8"?>

<RelativeLayout android:id="@+id/RelativeLayout01"
android:layout_width="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="wrap_content" android:paddingBottom="4dip"
android:paddingLeft="12dip" android:paddingRight="12dip"
android:descendantFocusability="blocksDescendants" >  
<ListView android:layout_width="wrap_content"   
android:layout_height="400dip"   
android:id="@+id/MyListView">  
</ListView>
<LinearLayout
android:id="@+id/bottom_panel"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center_horizontal"
android:layout_alignParentBottom="true"
>
<Button android:id="@+id/btn_config_clear"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:width="100dip"
android:text="清空" />
<Button android:id="@+id/btn_config_close"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:width="100dip"
android:text="退出" />
</LinearLayout>
</RelativeLayout>  

  list.xml
  <?xml version="1.0" encoding="utf-8"?>

<!-- 此布局文件用来定义listview 的显示方式 -->
<RelativeLayout android:id="@+id/RelativeLayout01"
android:layout_width="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="wrap_content" android:paddingBottom="4dip"
android:paddingLeft="12dip" android:paddingRight="12dip"
android:descendantFocusability="blocksDescendants" >
<TextView android:layout_height="wrap_content"
android:textSize="20dip" android:layout_width="fill_parent"
android:id="@+id/ItemTitle" />
<TextView android:layout_height="wrap_content"
android:layout_width="fill_parent"  android:layout_below="@+id/ItemTitle"
android:id="@+id/ItemType" />
<TextView android:layout_height="wrap_content" android:layout_below="@+id/ItemType"
android:layout_width="fill_parent"
android:id="@+id/ItemTime" />
<TextView android:layout_height="wrap_content"
android:layout_width="fill_parent" android:layout_below="@+id/ItemTime"
android:id="@+id/ItemStatus" />
<TextView android:layout_height="wrap_content"
android:layout_width="fill_parent" android:layout_below="@+id/ItemStatus"
android:id="@+id/ItemText" />
<Button android:id="@+id/btn_config_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/ItemText"
android:layout_alignParentRight="true"
android:focusable="false"
android:width="50dip"
android:text="查看" />
<Button android:id="@+id/btn_config_delete"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toLeftOf="@+id/btn_config_view"
android:layout_alignTop="@+id/btn_config_view"
android:focusable="false"
android:width="50dip"
android:text="删除" />
</RelativeLayout>  
  AndroidManifest.xml
  中 添加手机自启动注册信息android.permission.RECEIVE_BOOT_COMPLETED
  添加广播监听
  <receiver android:name=".BootReceiver">
  <intent-filter android:priority="100">
  <action android:name="android.intent.action.BOOT_COMPLETED" />
  <action android:name="android.provider.Telephony.SMS_RECEIVED" />
  <category android:name="android.intent.category.LAUNCHER" />
  </intent-filter>
  </receiver>
  这里添加短信监听广播接收android.provider.Telephony.SMS_RECEIVED
  完整的AndroidManifest.xml
  <?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.msi.manning">
<application android:icon="@drawable/chat">
<activity android:name="com.msi.manning.SMSNotifyActivity"
android:label="@string/app_name" android:clearTaskOnLaunch="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name=".BootReceiver">
<intent-filter android:priority="100">
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</receiver>
</application>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission> <!-- 程序接收短信权限 -->
<uses-permission android:name="android.permission.READ_SMS"></uses-permission>  <!-- 读短信权限 -->
</manifest>
  
DSC0000.jpg

 

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-307720-1-1.html 上篇帖子: SQLite指南(6)-处理database is locked的方法 下篇帖子: 总结:SQLite不支持的SQL语法有哪些?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表