Android无UI后台应用重启自启实现方案技术问询
需求与问题
我希望开发一款无UI的Android后台应用(采用Service?),核心功能为检测IP变化、发起HTTP请求并将请求结果以通知形式推送。
我大致了解各项功能的实现方式,但无法解决设备重启后无需用户操作自动重新激活该后台服务的问题。网上很多示例现已失效,恳请告知该需求是否可行,以及需搭建哪些核心组件?
补充说明
我已了解原需求无法实现及原因,现重新明确需求:希望应用在重启后(重启前已启动的情况下)能重新运行。目前应用可在后台显示但未执行逻辑,BroadcastReceiver的onReceive已触发,但不知如何将其与业务逻辑关联(当前逻辑绑定在Activity中)。
我的代码大致如下:
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { ConnectivityManager connectivityManager = getSystemService(ConnectivityManager.class); connectivityManager.registerDefaultNetworkCallback(new ConnectivityManager.NetworkCallback() { @Override public void onAvailable(@NonNull Network network) { pokeServer(MainActivity.this); } }); } private void pokeServer(Activity activity) { final String URL = "https://***"; final String ident = "ident"; final String pwd = "passwd"; final String NOTOK = "injoignable"; new BackgroundTask(activity) { private String result; @Override public void doInBackground() { InputStream inputStream = null; HttpURLConnection conn = null; final String basicAuth = "Basic " + Base64.encodeToString((ident + ":" + pwd).getBytes(), Base64.NO_WRAP); try { conn = (HttpURLConnection) new URL(URL).openConnection(); conn.setRequestProperty("Authorization", basicAuth); conn.connect(); int response = conn.getResponseCode(); if (response != 200) { this.result = null; return; } inputStream = conn.getInputStream(); if (inputStream == null) { this.result = null; return; } InputStreamReader inputStreamReader = new InputStreamReader(inputStream, StandardCharsets.UTF_8); BufferedReader reader = new BufferedReader(inputStreamReader); StringBuilder buffer = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { buffer.append(line); buffer.append("\n"); } this.result = new String(buffer); return; } catch (IOException e) { this.result = null; return; } finally { if (conn != null) conn.disconnect(); if (inputStream != null) try { inputStream.close(); } catch (IOException ignored) { } } } @Override public void onPostExecute() { if (this.result == null) this.result = NOTOK; Toast vwToast = Toast.makeText(activity, this.result.trim(), Toast.LENGTH_LONG); vwToast.show(); NotificationScheduler.notification(activity, this.result); activity.finishAffinity(); } }.execute(); } }
内容的提问来源于stack exchange,提问作者Chris972
相关产品推荐
相关产品推荐

