setForeground works.

This commit is contained in:
hypnosis-i2p 2016-06-19 20:35:17 +08:00
parent 1dae3d951a
commit 46fafebade
10 changed files with 303 additions and 36 deletions

View file

@ -0,0 +1,97 @@
package org.purplei2p.i2pd;
import org.qtproject.qt5.android.bindings.QtActivity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
public class I2PDMainActivity extends QtActivity
{
private static I2PDMainActivity instance;
public I2PDMainActivity() {}
/* (non-Javadoc)
* @see org.qtproject.qt5.android.bindings.QtActivity#onCreate(android.os.Bundle)
*/
@Override
public void onCreate(Bundle savedInstanceState) {
I2PDMainActivity.setInstance(this);
super.onCreate(savedInstanceState);
//set the app be foreground (do not unload when RAM needed)
doBindService();
}
/* (non-Javadoc)
* @see org.qtproject.qt5.android.bindings.QtActivity#onDestroy()
*/
@Override
protected void onDestroy() {
I2PDMainActivity.setInstance(null);
doUnbindService();
super.onDestroy();
}
public static I2PDMainActivity getInstance() {
return instance;
}
private static void setInstance(I2PDMainActivity instance) {
I2PDMainActivity.instance = instance;
}
// private LocalService mBoundService;
private ServiceConnection mConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className, IBinder service) {
// This is called when the connection with the service has been
// established, giving us the service object we can use to
// interact with the service. Because we have bound to a explicit
// service that we know is running in our own process, we can
// cast its IBinder to a concrete class and directly access it.
// mBoundService = ((LocalService.LocalBinder)service).getService();
// Tell the user about this for our demo.
// Toast.makeText(Binding.this, R.string.local_service_connected,
// Toast.LENGTH_SHORT).show();
}
public void onServiceDisconnected(ComponentName className) {
// This is called when the connection with the service has been
// unexpectedly disconnected -- that is, its process crashed.
// Because it is running in our same process, we should never
// see this happen.
// mBoundService = null;
// Toast.makeText(Binding.this, R.string.local_service_disconnected,
// Toast.LENGTH_SHORT).show();
}
};
private boolean mIsBound;
private void doBindService() {
// Establish a connection with the service. We use an explicit
// class name because we want a specific service implementation that
// we know will be running in our own process (and thus won't be
// supporting component replacement by other applications).
bindService(new Intent(this,
LocalService.class), mConnection, Context.BIND_AUTO_CREATE);
mIsBound = true;
}
void doUnbindService() {
if (mIsBound) {
// Detach our existing connection.
unbindService(mConnection);
mIsBound = false;
}
}
}

View file

@ -0,0 +1,92 @@
package org.purplei2p.i2pd;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.support.v4.app.NotificationCompat;
import android.util.Log;
import android.widget.Toast;
public class LocalService extends Service {
// private NotificationManager mNM;
// Unique Identification Number for the Notification.
// We use it on Notification start, and to cancel it.
private int NOTIFICATION = R.string.local_service_started;
/**
* Class for clients to access. Because we know this service always
* runs in the same process as its clients, we don't need to deal with
* IPC.
*/
public class LocalBinder extends Binder {
LocalService getService() {
return LocalService.this;
}
}
@Override
public void onCreate() {
// mNM = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
// Display a notification about us starting. We put an icon in the status bar.
showNotification();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i("LocalService", "Received start id " + startId + ": " + intent);
return START_NOT_STICKY;
}
@Override
public void onDestroy() {
// Cancel the persistent notification.
//mNM.cancel(NOTIFICATION);
stopForeground(true);
// Tell the user we stopped.
Toast.makeText(this, R.string.local_service_stopped, Toast.LENGTH_SHORT).show();
}
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
// This is the object that receives interactions from clients. See
// RemoteService for a more complete example.
private final IBinder mBinder = new LocalBinder();
/**
* Show a notification while this service is running.
*/
private void showNotification() {
// In this sample, we'll use the same text for the ticker and the expanded notification
CharSequence text = getText(R.string.local_service_started);
// The PendingIntent to launch our activity if the user selects this notification
PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
new Intent(this, I2PDMainActivity.class), 0);
// Set the info for the views that show in the notification panel.
Notification notification = new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.itoopie) // the status icon
.setTicker(text) // the status text
.setWhen(System.currentTimeMillis()) // the time stamp
.setContentTitle(getText(R.string.local_service_label)) // the label of the entry
.setContentText(text) // the contents of the entry
.setContentIntent(contentIntent) // The intent to send when the entry is clicked
.build();
// Send the notification.
//mNM.notify(NOTIFICATION, notification);
startForeground(NOTIFICATION, notification);
}
}

View file

@ -62,7 +62,6 @@ import android.content.Intent;
import android.content.ServiceConnection;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.PackageInfo;
import android.content.res.Configuration;
import android.content.res.Resources.Theme;
@ -1589,34 +1588,34 @@ public class QtActivity extends Activity
//@ANDROID-11
//////////////// Activity API 12 /////////////
//@ANDROID-12
@Override
public boolean dispatchGenericMotionEvent(MotionEvent ev)
{
if (QtApplication.m_delegateObject != null && QtApplication.dispatchGenericMotionEvent != null)
return (Boolean) QtApplication.invokeDelegateMethod(QtApplication.dispatchGenericMotionEvent, ev);
else
return super.dispatchGenericMotionEvent(ev);
}
public boolean super_dispatchGenericMotionEvent(MotionEvent event)
{
return super.dispatchGenericMotionEvent(event);
}
//---------------------------------------------------------------------------
@Override
public boolean onGenericMotionEvent(MotionEvent event)
{
if (QtApplication.m_delegateObject != null && QtApplication.onGenericMotionEvent != null)
return (Boolean) QtApplication.invokeDelegateMethod(QtApplication.onGenericMotionEvent, event);
else
return super.onGenericMotionEvent(event);
}
public boolean super_onGenericMotionEvent(MotionEvent event)
{
return super.onGenericMotionEvent(event);
}
//---------------------------------------------------------------------------
//@ANDROID-12
////@ANDROID-12
// @Override
// public boolean dispatchGenericMotionEvent(MotionEvent ev)
// {
// if (QtApplication.m_delegateObject != null && QtApplication.dispatchGenericMotionEvent != null)
// return (Boolean) QtApplication.invokeDelegateMethod(QtApplication.dispatchGenericMotionEvent, ev);
// else
// return super.dispatchGenericMotionEvent(ev);
// }
// public boolean super_dispatchGenericMotionEvent(MotionEvent event)
// {
// return super.dispatchGenericMotionEvent(event);
// }
// //---------------------------------------------------------------------------
//
// @Override
// public boolean onGenericMotionEvent(MotionEvent event)
// {
// if (QtApplication.m_delegateObject != null && QtApplication.onGenericMotionEvent != null)
// return (Boolean) QtApplication.invokeDelegateMethod(QtApplication.onGenericMotionEvent, event);
// else
// return super.onGenericMotionEvent(event);
// }
// public boolean super_onGenericMotionEvent(MotionEvent event)
// {
// return super.onGenericMotionEvent(event);
// }
// //---------------------------------------------------------------------------
////@ANDROID-12
}