关于android:延迟应用程序关闭并发送消息

Delay application close and make an send a message

实际上我有一个 TCP 客户端,它 onStart 连接到服务器并将设备 IP 和号码发送给它,但现在我希望当应用程序关闭时( onDestroy )延迟几秒钟(重新打开的正确时间连接并发送另一条消息)并发送另一条消息,其中我说设备处于离线状态。

我已经尝试过使用 onDestroy 方法,但它可能很疯狂,而且很明显
那没有用(我尝试在 onDestroy 上做以下事情:

1
2
3
4
5
6
7
8
9
10
11
12
protected void onDestroy() {
    new ConnectTask().execute("");
    if (client != null) {
        client.sendMessage(trm +"OFFLINE");
    }
    if (client != null) {
        client.stopClient();
    }

    super.onDestroy();
    server.onDestroy();
}

这是我调用 TCP 客户端并发送启动消息的 MainActivity 代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
public class MainActivity extends AppCompatActivity {
Server server;
static Client client;
settings Settings;
public static TextView terminale, indr, msg;
TextView log;
static TextView msgServer;
static String ipp;
static String trm;
static DataBaseHandler myDB;
allert Allert;
SharedPreferences prefs;
String s1 ="GAB Tamagnini SRL ?? 2017 \
" +
       "Via Beniamino Disraeli, 17,\
" +
       "42124 Reggio Emilia \
" +
       "Telefono: 0522 / 38 32 22 \
" +
       "Fax: 0522 / 38 32 72 \
" +
       "Partita IVA, Codice Fiscale \
" +
       "Reg. Impr. di RE 00168780351 \
" +
       "Cap. soc. a?? 50.000,00 i.v. \
" +"" +
       "REA n. RE-107440 \
" +
       "presso C.C.I.A.A. di Reggio Emilia";
ImageButton settings, helps, allerts, home;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Utils.darkenStatusBar(this, R.color.colorAccent);
    server = new Server(this);
    myDB = DataBaseHandler.getInstance(this);

    msg = (TextView) findViewById(R.id.msg);
    log = (TextView) findViewById(R.id.log_avviso);
    settings = (ImageButton) findViewById(R.id.impo);
    helps = (ImageButton) findViewById(R.id.aiut);
    allerts = (ImageButton) findViewById(R.id.msge);
    home = (ImageButton) findViewById(R.id.gab);
    terminale = (TextView) findViewById(R.id.terminal);
    indr = (TextView) findViewById(R.id.indr);
    msgServer = (TextView) findViewById(R.id.serverMSG);

    final Cursor cursor = myDB.fetchData();
    if (cursor.moveToFirst()) {
        do {
            indr.setText(cursor.getString(1));
            terminale.setText(cursor.getString(2));
            Client.SERVER_IP = cursor.getString(1);
            trm = cursor.getString(2);
        } while (cursor.moveToNext());
    }


    startService(new Intent(MainActivity.this,FinalizingOperationsService.class));

    WifiManager wm = (WifiManager) getSystemService(WIFI_SERVICE);
    ipp = Formatter.formatIpAddress(wm.getConnectionInfo().getIpAddress());

    startConnection.postDelayed(runnableConnection,5000);
    startMessage.postDelayed(runnableMessage,5500);

    cursor.close();
    server.Parti();


    home.setOnClickListener(new View.OnClickListener() {
                                int counter = 0;
        @Override
        public void onClick(View view) {
                                    counter++;
                                    if (counter == 10) {
                                        AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
                                        builder.setCancelable(true);
                                        builder.setMessage(s1);
                                        builder.show();
                                        counter = 0;
                                    }
        }
    });

    settings.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent impostazioni = new Intent(getApplicationContext(), settingsLogin.class);
            startActivity(impostazioni);
        }
    });

    helps.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent pgHelp = new Intent(getApplicationContext(), help.class);
            startActivity(pgHelp);
        }
    });

    allerts.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Server.count = 0;
            SharedPreferences prefs = getSharedPreferences("MY_DATA", MODE_PRIVATE);
            SharedPreferences.Editor editor = prefs.edit();
            editor.clear();
            editor.apply();
            msg.setVisibility(View.INVISIBLE);
            Intent pgAlert = new Intent(getApplicationContext(), allert.class);
            startActivity(pgAlert);
        }
    });

}

@Override
protected void onDestroy() {
    super.onDestroy();
    server.onDestroy();
}

public static class ConnectTask extends AsyncTask<String, String, Client> {

    @Override
    protected Client doInBackground(String... message) {


        client = new Client(new Client.OnMessageReceived() {
            @Override

            public void messageReceived(String message) {

                publishProgress(message);

            }
    });
        client.run();

        return null;
    }

    @Override
    protected void onProgressUpdate(String... values) {
        super.onProgressUpdate(values);

            msgServer.setTextColor(Color.parseColor("#00FF00"));
            msgServer.setText("ONLINE");

        Log.d("test","response" + values[0]);
    }
}

static Handler startConnection = new Handler();
static Runnable runnableConnection = new Runnable() {
    @Override
    public void run() {

        new ConnectTask().execute("");
    }
};

static Handler startMessage = new Handler();
static Runnable runnableMessage = new Runnable() {
    @Override
    public void run() {
        final Cursor cursor = myDB.fetchData();
        if (cursor.moveToFirst()) {
            do {
                Client.SERVER_IP = cursor.getString(1);
                trm = cursor.getString(2);
            } while (cursor.moveToNext());
        }
        if (client != null) {
            client.sendMessage(ipp +"#" + trm);
        }
    }
};

static Handler startMessageClose = new Handler();
static Runnable runnableMessageClose = new Runnable() {
    @Override
    public void run() {
        if (client != null) {
            client.sendMessage(trm +"IS OFFLINE");
        }
        }
    };


}

打开连接的正确命令是new ConnectTask().execute("");
当我用 if (client != null) { client.sendMessage(ipp +"#" + trm); }

发送消息时

FinalizingOperationsService.java 代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public class FinalizingOperationsService extends Service {

@Override
public IBinder onBind(Intent intent) {
    return null;
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Log.d("FOService","Service Started");
    return START_STICKY;
}

@Override
public void onDestroy() {
    super.onDestroy();
    Log.d("FOService","Service Destroyed");
}

@Override
public void onTaskRemoved(Intent rootIntent) {
    Log.e("FOService","Service Ends");
    MainActivity.startConnection.removeCallbacks(MainActivity.runnableConnection);
    MainActivity.startConnection.postDelayed(MainActivity.runnableConnection,100);

    MainActivity.startMessageClose.removeCallbacks(MainActivity.runnableMessageClose);
    MainActivity.startMessageClose.postDelayed(MainActivity.runnableMessageClose,110);

    stopSelf();
    }
}

像这样创建一个新服务,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class FinalizingOperationsService extends Service {

        @Override
        public IBinder onBind(Intent intent) {
            return null;
        }

        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            Log.d("FOService","Service Started");
            return START_STICKY;
        }

        @Override
        public void onDestroy() {
            super.onDestroy();
            Log.d("FOService","Service Destroyed");
        }

        @Override
        public void onTaskRemoved(Intent rootIntent) {
            Log.e("FOService","Service Ends");
            // write server updation code here
            // after completing code perform stopself() to stop this service;
        }
    }

并像这样在清单文件中定义此服务,

1
<service android:name=". FinalizingOperationsService" android:stopWithTask="false"/>

最后在你的主要活动的 onCreate 方法中启动服务

startService(newIntent(getContext(),FinalizingOperationsService.class));

解释:
当应用程序被杀死或销毁时,服务的 onTaskRemoved() 方法被调用,因此在此方法中您可以执行最终操作以通知服务器并在操作完成后停止您的服务。希望对你有帮助。