最新安卓系统很难写个死循环直接跑了,所以我们需要使用Intent,来开始Service,再通过Service调用AlarmManager。
public class MainActivity extends AppCompatActivity { private Intent intent; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity\_main); intent = new Intent(this, LongRunningService.class); startService(intent); } @Override protected void onDestroy() { super.onDestroy(); stopService(intent); } }
然后再创建一个LongRunningService,在其中调用AlarmManager。
AlarmManager manager = (AlarmManager) getSystemService(ALARM_SERVICE); int Minutes = 60*1000; //此处规定执行的间隔时间 long triggerAtTime = SystemClock.elapsedRealtime() + Minutes; Intent intent1 = new Intent(this, AlarmReceiver.class);//注入要执行的类 PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent1, 0); manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtTime, pendingIntent); return super.onStartCommand(intent, flags, startId);
在AlarmReceiver中调用我们的方法。
Log.e("saurfang","测试定时任务----BEGIN"); //微信部分 postWXMsg.readWXDatabase(); //QQ部分 postQQMsg.readQQDatabase(); Log.e("saurfang","测试定时任务----END"); //再次开启LongRunningService这个服务,即可实现定时循环。 Intent intentNext = new Intent(context, LongRunningService.class); context.startService(intentNext);
- 安卓不允许在主线程里进行网络连接,可以直接用 retrofit2 来发送数据。
- 项目需要授权网络连接
- 项目需要引入的包
implementation files('libs/sqlcipher.jar') implementation files('libs/sqlcipher-javadoc.jar') implementation 'com.squareup.retrofit2:retrofit:2.0.0' implementation 'com.squareup.retrofit2:converter-gson:2.0.0'
如果复制文件时失败,校验文件路径不存在,多半是因为授权问题。需要对数据库文件授权 全用户rwx权限
部分源码
(因为种种原因,我不太好直接把源码贴上来。)
复制文件的方法
/** * 复制单个文件 * * @param oldPath String 原文件路径 如:c:/fqf.txt * @param newPath String 复制后路径 如:f:/fqf.txt * @return boolean */ public static boolean copyFile(String oldPath, String newPath) { deleteFolderFile(newPath, true); Log.e("copyFile", "time_1:" + System.currentTimeMillis()); InputStream inStream = null; FileOutputStream fs = null; try { int bytesum = 0; int byteread = 0; File oldfile = new File(oldPath); Boolean flag = oldfile.exists(); Log.e("copyFile", "flag:" +flag ); if (oldfile.exists()) { //文件存在时 inStream = new FileInputStream(oldPath); //读入原文件 fs = new FileOutputStream(newPath); byte[] buffer = new byte[2048]; while ((byteread = inStream.read(buffer)) != -1) { bytesum += byteread; //字节数 文件大小 fs.write(buffer, 0, byteread); } Log.e("copyFile", "time_2:" + System.currentTimeMillis()); } } catch (Exception e) { System.out.println("复制单个文件操作出错"); e.printStackTrace(); } finally { try { if (inStream != null) { inStream.close(); } if (fs != null) { fs.close(); } } catch (IOException e) { e.printStackTrace(); } } return true; } /** * 删除单个文件 * * @param filepath * @param deleteThisPath */ public static void deleteFolderFile(String filepath, boolean deleteThisPath) { if (!TextUtils.isEmpty(filepath)) { try { File file = new File(filepath); if (file.isDirectory()) { //处理目录 File files[] = file.listFiles(); for (int i = 0; i < file.length(); i++) { deleteFolderFile(files[i].getAbsolutePath(), true); } } if (deleteThisPath) { if (!file.isDirectory()) { //删除文件 file.delete(); } else { //删除目录 if (file.listFiles().length == 0) { file.delete(); } } } } catch (Exception e) { e.printStackTrace(); } } }
MD5方法
public class MD5Until { public static char HEX_DIGITS[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; //将字符串转化为位 public static String toHexString(byte[] b){ StringBuilder stringBuilder = new StringBuilder(b.length * 2); for (int i = 0; i < b.length; i++) { stringBuilder.append(HEX_DIGITS[(b[i] & 0xf0) >>> 4]); stringBuilder.append(HEX_DIGITS[b[i] & 0x0f]); } return stringBuilder.toString(); } public static String md5(String string){ try { MessageDigest digest = java.security.MessageDigest.getInstance("MD5"); digest.update(string.getBytes()); byte messageDigest[] = digest.digest(); return toHexString(messageDigest); }catch (NoSuchAlgorithmException e){ e.printStackTrace(); } return ""; } }
QQ信息解密方法
public class MessageDecode { public String imeiID; public int imeiLen; public MessageDecode(String imeiID) { this.imeiID = imeiID; this.imeiLen = imeiID.length(); } public boolean isChinese(byte ch) { int res = ch & 0x80; if(res != 0) return true; return false; } public String timeDecode(String time) { String datetime = "1970-01-01 08:00:00"; SimpleDateFormat sdFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); try { long second = Long.parseLong(time); Date dt = new Date(second * 1000); datetime = sdFormat.format(dt); } catch (NumberFormatException e) { e.printStackTrace(); } return datetime; } public String nameDecode(String name) { byte nbyte[] = name.getBytes(); byte ibyte[] = imeiID.getBytes(); byte xorName[] = new byte[nbyte.length]; int index = 0; for(int i = 0; i < nbyte.length; i++) { if(isChinese(nbyte[i])){ xorName[i] = nbyte[i]; i++; xorName[i] = nbyte[i]; i++; xorName[i] = (byte)(nbyte[i] ^ ibyte[index % imeiLen]); index++; } else { xorName[i] = (byte)(nbyte[i] ^ ibyte[index % imeiLen]); index++; } } return new String(xorName); } public String uinDecode(String uin) { byte ubyte[] = uin.getBytes(); byte ibyte[] = imeiID.getBytes(); byte xorMsg[] = new byte[ubyte.length]; int index = 0; for(int i = 0; i < ubyte.length; i++) { xorMsg[i] = (byte)(ubyte[i] ^ ibyte[index % imeiLen]); index++; } return new String(xorMsg); } public String msgDecode(byte[] msg) { byte ibyte[] = imeiID.getBytes(); byte xorMsg[] = new byte[msg.length]; int index = 0; for(int i = 0; i < msg.length; i++) { xorMsg[i] = (byte)(msg[i] ^ ibyte[index % imeiLen]); index++; } return new String(xorMsg); } }
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。
标签:SQLite
相关阅读 >>
database.net强大的数据库查询管理工具使用图文教程
Sqlite expert pro5.0如何安装可视化数据库管理软件激活教程
sql学习之case when then else end的用法
更多相关阅读请进入《Sqlite》频道 >>

数据库系统概念 第6版
本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。