Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/204.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过可浏览意图关闭Android应用程序_Android_Android Intent_Android Service - Fatal编程技术网

通过可浏览意图关闭Android应用程序

通过可浏览意图关闭Android应用程序,android,android-intent,android-service,Android,Android Intent,Android Service,我创建了一个只能通过浏览器中的链接打开的应用程序。但是,我也需要从浏览器关闭该应用程序。我设法将参数传递给intent,以便决定是关闭还是打开应用程序。我在代码中放置了一些日志调试,这是打开它时的logcat输出 07-10 15:06:52.383 20718-20718/xx.yy.,mypp D/MAIN﹕ ONCREATE 07-10 15:06:52.385 20718-20718/xx.yy.myapp D/PARAMS﹕ add 07-10 15:06:52.385 2071

我创建了一个只能通过浏览器中的链接打开的应用程序。但是,我也需要从浏览器关闭该应用程序。我设法将参数传递给intent,以便决定是关闭还是打开应用程序。我在代码中放置了一些日志调试,这是打开它时的logcat输出

07-10 15:06:52.383  20718-20718/xx.yy.,mypp D/MAIN﹕ ONCREATE
07-10 15:06:52.385  20718-20718/xx.yy.myapp D/PARAMS﹕ add
07-10 15:06:52.385  20718-20718/xx.yy.myapp D/PARAMS﹕ START
07-10 15:06:52.385  20718-20718/xx.yy.myapp D/MAIN﹕ READING PARAMS
07-10 15:06:52.386  20718-20718/xx.yy.myapp W/Resources﹕ Converting to string: TypedValue{t=0x1c/d=0x0 a=1 r=0x106000d}
07-10 15:06:52.388  20718-20718/xx.yy.myapp D/MAIN﹕ START
07-10 15:06:52.388  20718-20718/xx.yy.myapp D/MAIN﹕ startCameraService
07-10 15:06:52.388  20718-20718/xx.yy.myapp D/MAIN﹕ Floating camera OFF
07-10 15:06:52.388  20718-20718/xx.yy.myapp D/MAIN﹕ Starting service
07-10 15:06:52.394  20718-20718/xx.yy.myapp D/MAIN﹕ Floating camera ACTIVE
一切似乎都很好。然后我点击另一个链接关闭它,Logcat显示:

07-10 15:07:02.176  20718-20718/xx.yy.myapp D/MAIN﹕ ONCREATE
07-10 15:07:02.181  20718-20718/xx.yy.myapp D/PARAMS﹕ del
07-10 15:07:02.188  20718-20718/xx.yy.myapp D/PARAMS﹕ CLOSE
07-10 15:07:02.188  20718-20718/xx.yy.myapp D/MAIN﹕ READING PARAMS
07-10 15:07:02.194  20718-20718/xx.yy.myapp W/Resources﹕ Converting to string: TypedValue{t=0x1c/d=0x0 a=1 r=0x106000d}
07-10 15:07:02.195  20718-20718/xx.yy.myapp D/MAIN﹕ STOP
07-10 15:07:02.195  20718-20718/xx.yy.myapp D/MAIN﹕ stopCameraService
07-10 15:07:02.204  20718-20718/xx.yy.myapp D/MAIN﹕ Floating camera OFF
07-10 15:07:02.264  20718-20718/xx.yy.myapp D/MAIN﹕ DESTROY!!!
但该应用程序仍然是开放的。这是主活动的代码:

package xx.yy.myapp;

import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Toast;

import java.util.List;


public class MainActivity extends Activity {

    private Intent cameraService = null;
    private boolean actionStart = true;
    private SharedPreferences prefs;
    private SharedPreferences.Editor editor;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        prefs = getSharedPreferences(getString(R.string.shared_prefs), MODE_PRIVATE);
        editor = prefs.edit();
        setContentView(R.layout.activity_main);
        Log.d("MAIN", "ONCREATE");
    }

    @Override
    protected void onResume()
    {
        super.onResume();
        readParams();
        Log.d("MAIN", "READING PARAMS");
        if(actionStart) {
            Toast.makeText(this, getText(R.string.camera_starting), Toast.LENGTH_LONG);
            Log.d("MAIN", "START");
            startCameraService();
            moveTaskToBack(true);
            onStateChange();
        }
        else
        {
            Toast.makeText(this, getText(R.string.camera_closing), Toast.LENGTH_SHORT);
            Log.d("MAIN", "STOP");
            stopCameraService();
        }
        finish();
    }

    @Override
    protected void onDestroy()
    {
        Log.d("MAIN", "DESTROY!!!");
        super.onDestroy();
    }

    private void readParams()
    {
        String cameraId = "";
        String quality = "medium";
        Uri data = getIntent().getData();
        String host = data.getHost();
        List<String> params = data.getPathSegments();
        try {
            cameraId = params.get(1);
            Log.d("PARAMS", params.get(0));
            actionStart = params.get(0).compareTo("add")==0;
            quality = params.get(2);
        }
        catch(IndexOutOfBoundsException ibe)
        { /*sometimes quality param is not passed*/ }
        Log.d("PARAMS", actionStart?"START":"CLOSE");
        editor.putString("host", host);
        editor.putString("id", cameraId);
        editor.putString("quality", quality);
        editor.apply();
    }

    private void startCameraService()
    {
        Log.d("MAIN", "startCameraService");
        if(!checkService())
        {
            Log.d("MAIN", "Starting service");
            this.cameraService = new Intent(this, FloatCamService.class);
            startService(this.cameraService);
            checkService();
        }
    }

    private void stopCameraService()
    {
        Log.d("MAIN", "stopCameraService");
        if(checkService()) {
            Log.d("MAIN", "Stopping service");
            stopService(this.cameraService);
        }
    }

    private boolean checkService()
    {
        editor.putBoolean("serviceStatus", (this.cameraService != null && startService(this.cameraService) != null)).apply();
        onStateChange();
        return getServiceStatus();
    }

    public void toggleCamera(View clickedView)
    {
        if(!getServiceStatus()) {
            this.startCameraService();
        }
        else
        {
            this.stopCameraService();
        }
    }

    public void openStreaming(View clickedView)
    {
        startActivity(new Intent(this, StreamingActivity.class));
    }

    private boolean getServiceStatus()
    {
        return prefs.getBoolean("serviceStatus", false);
    }

    public void onStateChange() {
        if (getServiceStatus()) {
            Log.d("MAIN", getString(R.string.service_on));
        } else {
            Log.d("MAIN", getString(R.string.service_off));
        }
    }
}

请定义“应用程序仍处于打开状态”。你所说的“开放”具体是什么意思?你是如何确定它是否是“开放”的?@commonware基本上是一个应用程序,启动一个服务,该服务创建一个浮动视图(如Facebook中的聊天头)。当我“关闭”应用程序时,聊天头仍然存在。但是停止服务的调用应该会破坏所有这些。“但是停止服务的调用应该会破坏所有这些”--那么可能在您的服务代码中有一个bug,服务在其
ondestory()中没有摆脱浮动视图
。我只是在服务
onDestroy
中放了一些Log.d,它似乎没有被调用。为什么呢?我在问题中添加了onDestroy代码,这取决于活动的状态,
this.cameraService
将为
null
,因为您不必初始化它<代码>意图对象的创建和保存成本非常低。我建议在每次使用时创建一个新的,而不是费心去缓存它。但是,如果
this.cameraService
null
,我希望您会因
NullPointerException
或其他问题而崩溃。您还应该检查您的
checkService()
行为。
@Override
public void onDestroy() {
    try {
        Log.d("XXXXXXXXXXXXX", (container != null)? "NULL":"NOT NULL");
        if (container != null) windowManager.removeView(container);
        camHead.stop();
    }catch(IllegalArgumentException iae)
    {

    }catch(NullPointerException npe)
    {
    }
    super.onDestroy();
}